Java Hibernate错误:org.Hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联
我有两个用户对象,当我尝试使用Java Hibernate错误:org.Hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联,java,hibernate,orm,Java,Hibernate,Orm,我有两个用户对象,当我尝试使用 session.save(userObj); 我得到以下错误: Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.pojo.rtrequests.User#com.pojo.rtrequests.User@d079b40b
session.save(userObj);
我得到以下错误:
Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
[com.pojo.rtrequests.User#com.pojo.rtrequests.User@d079b40b]
我正在使用创建会话
BaseHibernateDAO dao = new BaseHibernateDAO();
rtsession = dao.getSession(userData.getRegion(),
BaseHibernateDAO.RTREQUESTS_DATABASE_NAME);
rttrans = rtsession.beginTransaction();
rttrans.begin();
rtsession.save(userObj1);
rtsession.save(userObj2);
rtsession.flush();
rttrans.commit();
rtsession.close(); // in finally block
在保存之前,我还尝试过执行会话。clear()
,但仍然没有成功
这是我第一次在用户请求到来时得到session对象,所以我得到了为什么说session中存在该对象
有什么建议吗?您的Id映射正确吗?如果数据库负责通过标识符创建Id,则需要将您的userobject映射到该标识符。我已多次遇到此错误,很难找到它 基本上,hibernate所说的是,有两个对象具有相同的标识符(相同的主键),但它们不是相同的对象 我建议您分解代码,即注释掉位,直到错误消失,然后将代码放回原处,直到它回来,您应该会找到错误 它通常通过级联保存发生,其中对象a和B之间存在级联保存,但对象B已与会话关联,但与a上的实例不在同一个实例上 您使用的主键生成器是什么 我之所以问这个错误,是因为您告诉hibernate如何确定对象的持久状态(即对象是否持久)。发生此错误的原因可能是hibernate正在尝试持久化已持久化的对象。事实上,如果使用save-hibernate,您将尝试持久化该对象,并且可能已经有一个对象具有与会话关联的相同主键 示例 假设您有一个hibernate类对象,用于基于主键组合(第1列和第2列)的10行表。现在,您已经在某个时间点从表中删除了5行。现在,如果您再次尝试添加相同的10行,而hibernate尝试将对象持久化到数据库中,那么将添加已删除的5行,而不会出现错误。现在,已经存在的其余5行将引发此异常
因此,最简单的方法是检查您是否更新/删除了某个表中属于某个内容的任何值,然后您是否再次尝试插入相同的对象另一个对我有效的方法是将实例变量改为Long而不是Long
我有主键变量long id; 将其更改为长id;工作
所有最好的在会话中获取对象,下面是一个示例:
MyObject ob = null;
ob = (MyObject) session.get(MyObject.class, id);
这只是hibernate造成的问题多于它解决的问题的一个方面。 在我的例子中,有许多对象具有相同的标识符0,因为它们是新的,没有标识符。数据库生成它们。我在某个地方读到没有设置0信号Id。保存这些对象的直观方法是对它们进行迭代,并使用hibernate来保存这些对象。但是你不能这么做——“当然你应该知道hibernate是这样那样工作的,因此你必须……” 所以现在我可以尝试将ID改为Long而不是Long,然后看看它是否有效。 最后,您自己用一个简单的映射器更容易实现这一点,因为hibernate只是一个额外的intransparent负担。
另一个例子:试图从一个数据库中读取参数并将其持久化到另一个数据库中会迫使您手动执行几乎所有的工作。但是,如果您必须这样做,那么使用hibernate只是额外的工作。您总是可以进行会话刷新。 Flush将同步会话中所有对象的状态(如果我错了,请有人纠正我),在某些情况下,它可能会解决您的问题
实现自己的equals和hashcode也可能对您有所帮助。我也遇到了这个问题,很难找到错误 我遇到的问题如下: Dao使用不同的hibernate会话读取了该对象 为了避免此异常,只需使用稍后将保存/更新此对象的dao重新读取该对象 因此:
希望能为一些人节省很多时间 检查是否忘记为@Id列添加@GenerateValue。 我对电影和流派之间的多对多关系也有同样的问题。节目播出了 Hibernate错误:org.Hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联 错误。
后来我发现,我只需确保GenreId get方法中有@GenerateValue。您可以检查级联设置。模型上的层叠设置可能导致此问题。我删除了级联设置(基本上不允许级联插入/更新),这解决了我的问题使用
会话。退出(对象)代码>使用execute()
方法的函数从会话缓存中删除实例。因此,对于第一次保存对象,在从缓存中逐出对象之前,通过调用session.save(object)
方法保存对象。同样,在调用execute()之前,通过调用session.saveOrUpdate(object)
或session.update(object)
来更新对象。只需检查id是否为null或0
if(offersubformtwo.getId()!=null && offersubformtwo.getId()!=0)
在将内容从表单设置为Pojo的add或update中,我也发现了这个错误。对我来说,有效的方法是确保主键(自动生成)不是PDT(即long、int等),而是对象(即long、Integer等)
当您创建要保存的对象时,请确保传递null而不是0。正如上面有人指出的那样,当我在一对多
关系的两端都有cascade=all
时,我遇到了这个问题,所以让我们假设一个-->B(a中的一对多和B中的多对一),并在a中更新B的实例
if(offersubformtwo.getId()!=null && offersubformtwo.getId()!=0)
String delQuery = "DELETE FROM OasisNode";
session.createQuery( delQuery ).executeUpdate();
session.flush();
session.clear();
/**
* Deletes the given entity, even if hibernate has an old reference to it.
* If the entity has already disappeared due to a db cascade then noop.
*/
public void delete(final Object entity) {
Object merged = null;
try {
merged = getSession().merge(entity);
}
catch (ObjectNotFoundException e) {
// disappeared already due to cascade
return;
}
getSession().delete(merged);
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
session.close();
session = HibernateUtil.getSessionFactory().openSession();
<id name="id">
<column name="id" sql-type="bigint" not-null="true"/>
<generator class="hibernateGeneratorClass"</generator>
</id>
public static Session getSession(boolean isSessionClear) {
if (session.isOpen() && isSessionClear) {
session.clear();
return session;
} else if (session.isOpen()) {
return session;
} else {
return sessionFactory.openSession();
}
}
CREATED 26.07.16
LAST_DDL_TIME 26.07.16
SEQUENCE_OWNER MY
SEQUENCE_NAME MY_ID_SEQ
MIN_VALUE 1
MAX_VALUE 9999999999999999999999999999
INCREMENT_BY 20 <-
CYCLE_FLAG N
ORDER_FLAG N
CACHE_SIZE 20 <-
LAST_NUMBER 180
@SequenceGenerator(name = "mySG", schema = "my",
sequenceName = "my_id_seq", allocationSize = 20 <-)
this.oldSet.retainAll(newSet);
this.oldSet.addAll(newSet);
Customer existingCustomer=getSession().get(Customer.class,1);
Customer customerFromUi;// This customer details comiong from UI with identifer 1
getSession().update(customerFromUi);// Here the issue comes
@ID
@GeneratedValue(strategy = GenerationType.IDENTITY)