【问题标题】:hibernate @onetomany relationship updates instead of insert during savehibernate @onetomany 关系更新而不是在保存期间插入
【发布时间】:2010-11-15 13:51:57
【问题描述】:

请帮我解决这个问题。我尝试了很多组合,但似乎没有任何效果。我正在尝试使用注释来实现休眠映射,但是在保存父对象及其子对象期间,我注意到正在调用更新语句而不是插入语句。

我有两个彼此之间具有一对多关系的类。

这些是类的映射:Receipt 有一对多的集合

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

问题是在保存收据时,例如:

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

它会产生这个错误:

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)

【问题讨论】:

  • 顺便说一句,我也尝试添加 @OneToMany(cascade = CascadeType.ALL),但没有任何效果

标签: hibernate spring annotations hibernate-annotations


【解决方案1】:

在双向多对一/一对多关系的情况下,“多”端应该是拥有端(并且@JoinColumn在拥有端指定),而“一”端应该有mappedBy 指向拥有方。在您的情况下,您还需要启用保存操作的级联:

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

另请参阅:

【讨论】:

  • 谢谢,但现在我有另一个错误(它在保存集合时发生):org.springframework.orm.hibernate3.HibernateSystemException:具有相同标识符值的不同对象已与会话关联
  • 当我不小心在 ManyToOne 端设置了 id 时,我也遇到了这个问题(哎呀)。只是发布这个以防其他人犯了这个错误。
猜你喜欢
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 2018-10-24
  • 2019-06-29
  • 2021-12-21
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
相关资源
最近更新 更多