2010-11-16 28 views
4

Possible Duplicate:
Spring + Hibernate : a different object with the same identifier value was already associated with the sessionun autre objet avec la même valeur d'identifiant a déjà été associé à l'erreur de session de sauvegarde

J'ai eu des problèmes avec mes annotations de mise en veille prolongée. J'ai une relation bidirectionnelle entre 2 classes. Voici la cartographie (grâce à 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; 
    ... 
} 

Mais lorsque je tente de sauver mon reçu une liste des collections en utilisant:

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

Il génère cette erreur:

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) 

mais quand je le change en

session.merge(receipt) 

il n'y a pas d'erreurs mais quand je vérifie ma base de données le reçuId fk sur la table colllections est mis à null ... Toute aide est appréciée. Merci^_^...

+0

Êtes-vous sûr de ne pas initialisez 'Collection.id' à 0? Comme il est autogénéré, il devrait être 'null' avant l'enregistrement. – axtavt

+0

oui, je ne mets pas collection.id à 0. merci pour la réponse – mileesah

Répondre

4

L'annotation mappedby sur le Receipt signifie que le Collection est en fait le côté possédante de la relation, ce qui est manifestement pas ce que vous vouliez puisque vous avez une cascade sur le Receipt.

Vous devez supprimer le mappedby sur le Receipt et suivre cet exemple de la documentation mise en veille prolongée:

@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; 
    ... 
} 

En utilisant le même code que vous avez ci-dessus pour exécuter la sauvegarde devrait fonctionner.

Il y a un peu plus d'informations sur ce ici: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/