другой объект с тем же значением идентификатора уже был связан с ошибкой сеанса при сохранении

Возможный дубликат:
Spring + Hibernate: другой объект с тем же значением идентификатора уже был связан с сеансом

У меня были проблемы с моими аннотациями гибернации. У меня двунаправленные отношения между двумя классами. Вот сопоставление (спасибо axtavt):

@Entity 
public class Receipt implements Serializable { 
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "receipt")
    private List<Collection> collections; 
    ...
}      

@Entity 
public class Collection implements Serializable { 
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    @ManyToOne 
    @JoinColumn(name="ReceiptId") 
    private Receipt receipt; 
    ...
}

Но когда я пытаюсь сохранить квитанцию ​​со списком коллекций, используя:

Receipt r = new Receipt();
List<Collection> cols = new ArrayList<Collection>();
cols.add(new Collection());
r.setCollections(cols);
getHibernateTemplate().save(r);

Он генерирует эту ошибку:

org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [com.coa.acctreports.pojo.Collection#0]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.coa.acctreports.pojo.Collection#0]
 at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:679)
 at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
 at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
 at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
 at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:683)
 at com.coa.acctreports.daoImp.AccountingReportsImpl.save(AccountingReportsImpl.java:35)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

но когда я меняю его на

session.merge(receipt)

у него нет ошибок, но когда я проверяю свою базу данных, для получения Id fk в таблице коллекций установлено значение null ... Любая помощь приветствуется. Спасибо ^_^...


person mileesah    schedule 16.11.2010    source источник
comment
Вы уверены, что не инициализируете Collection.id значением 0? Поскольку он создается автоматически, перед сохранением он должен быть равен null.   -  person axtavt    schedule 16.11.2010
comment
да, я не устанавливаю collection.id на 0. спасибо за ответ   -  person mileesah    schedule 16.11.2010


Ответы (1)


Аннотация mappedby на Receipt означает, что Collection на самом деле является владеющей стороной отношения, что явно не то, что вы предполагали, поскольку у вас есть каскад на Receipt.

Вы должны удалить mappedby на Receipt и следовать этому примеру из документации по спящему режиму:

@Entity 
public class Receipt implements Serializable { 
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name="ReceiptId")
    private List<Collection> collections; 
    ...
}      

@Entity 
public class Collection implements Serializable { 
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @ManyToOne 
    @JoinColumn(name="ReceiptId",insertable=false,updatable=false) 
    private Receipt receipt; 
    ...
}

Использование того же кода, что и выше, для сохранения должно работать.

Дополнительную информацию об этом можно найти здесь: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

person StevenWilkins    schedule 16.11.2010