2010-11-15 25 views
0

S'il vous plaît aidez-moi à comprendre cela. J'ai essayé tant de combinaisons mais rien ne semble fonctionner. J'essaye d'implémenter le mappage d'hibernate en utilisant des annotations mais pendant la sauvegarde de mon objet parent et de ses enfants j'ai remarqué qu'une instruction de mise à jour est appelée au lieu d'une instruction d'insertion.hibernate @onetomany mise à jour de la relation au lieu de l'insérer pendant la sauvegarde

J'ai deux classes qui ont une relation un-à-plusieurs les uns avec les autres.

Ce sont les correspondances de classe: réception a un à plusieurs collections

@Entity 
public class Receipt implements Serializable { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 
    @OneToMany 
    @JoinColumn(name="ReceiptId") 
    private List<Collection> collections; 

    //setters, getters 
} 


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

    //setters getters 
} 

Le problème est lors de la sauvegarde d'un reçu comme:

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:

Hibernate: insert into Receipt (userId, dateCreated, payor, receiptDate, receiptNumber, total) values (?, ?, ?, ?, ?, ?) 
Hibernate: update Collection set ReceiptId=? where id=? 
Nov 15, 2010 8:46:00 PM org.hibernate.jdbc.BatchingBatcher doExecuteBatch 
SEVERE: Exception executing batch: 
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85) 
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70) 
    at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:171) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027) 
    at org.springframework.orm.hibernate3.HibernateTemplate$28.doInHibernate(HibernateTemplate.java:883) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) 
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
    at org.springframework.orm.hibernate3.HibernateTemplate.flush(HibernateTemplate.java:881) 
    at com.coa.acctreports.daoImp.AccountingReportsImpl.update(AccountingReportsImpl.java:52) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
+0

par la façon dont je l'ai essayé aussi d'ajouter @OneToMany (cascade = CascadeType.ALL) mais rien n'a fonctionné – mileesah

Répondre

3

Dans le cas d'une relation bidirectionnelle plusieurs-à-un/un-à-plusieurs, le côté «plusieurs» devrait être le propre côté (et @JoinColumn est spécifié du côté propriétaire), alors que "un" côté doit avoir mappedBy pointant vers le côté propriétaire. Dans votre cas, vous devez également activer en cascade de l'opération de sauvegarde:

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

@Entity 
public class Collection implements Serializable { 
    @ManyToOne 
    @JoinColumn(name="ReceiptId") 
    private Receipt receipt; 
    ... 
} 

Voir aussi:

+0

merci mais maintenant j'ai une autre erreur (cela arrive quand il enregistre les collections): org.springframework.orm.hibernate3.HibernateSystemException: un objet différent avec le sam La valeur de l'identifiant était déjà associée à la session – mileesah