具有相同标识符值的不同对象已与保存时的会话错误相关联[重复]

Posted

技术标签:

【中文标题】具有相同标识符值的不同对象已与保存时的会话错误相关联[重复]【英文标题】:a different object with the same identifier value was already associated with the session error on save [duplicate] 【发布时间】:2011-05-10 19:26:33 【问题描述】:

可能重复:Spring + Hibernate : a different object with the same identifier value was already associated with the session

我的休眠注释一直有问题。我在两个类之间有双向关系。这是映射(感谢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)

它没有错误,但是当我检查我的数据库时,colllections 表上的receiptId fk 设置为null...感谢任何帮助。谢谢^_^...

【问题讨论】:

你确定不将Collection.id初始化为0吗?由于是自动生成的,所以保存前应该是null 是的,我没有将 collection.id 设置为 0。感谢您的回复 【参考方案1】:

Receipt 上的mappedby 注释意味着Collection 实际上是关系的拥有方,这显然不是您想要的,因为您在Receipt 上有级联。

您应该删除 Receipt 上的 mappedby 并按照休眠文档中的示例进行操作:

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

【讨论】:

以上是关于具有相同标识符值的不同对象已与保存时的会话错误相关联[重复]的主要内容,如果未能解决你的问题,请参考以下文章

休眠错误:org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联

Grails NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联

休眠:具有相同标识符值的不同对象已与会话相关联[重复]

Struts / hibernate NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联

org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联

类与对象