2010-11-16 2 views
4

Possible Duplicate:
Spring + Hibernate : a different object with the same identifier value was already associated with the sessionдругой объект с тем же значением идентификатора уже был связан с ошибкой сеанса по экономии

У меня возникли проблемы с моим 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 в таблице коллизий устанавливается в нуль ... Любая помощь приветствуется. Спасибо^_^...

+0

Вы уверены, что вы не инициализировать 'Collection.id' до 0? Поскольку он автогенерируется, он должен быть «null» перед сохранением. – axtavt

+0

да, я не устанавливаю collection.id 0. спасибо за ответ – mileesah

ответ

4

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/

Смежные вопросы

 Смежные вопросы