这里有一些 关于JPA实体的讨论,以及哪些hashCode()/ equals()实现应该用于JPA实体类.大多数(如果不是全部)它们依赖于Hibernate,但我想讨论它们JPA实现中性(顺便说一下,我使用的是EclipseLink).
所有可能的实现都有各自的优点和缺点:
hashCode()/equals()合同一致性(不变性)为List/ Set操作据我所知,有三种选择:
Object.equals()和Object.hashCode()
hashCode()/ equals()工作hashCode()/ equals()坏了hashCode()/ equals()坏了我的问题是:
更新1:
通过" hashCode()/ equals()被破坏",我的意思是连续hashCode()调用可能会返回不同的值,也就是(当正确实施)不在的感觉打破ObjectAPI文档,但是当试图从检索改变实体引起的问题Map, Set或其他基于哈希的Collection.因此,在某些情况下,JPA实现(至少EclipseLink)将无法正常工作. …
我有两个用户对象,而我尝试使用保存对象
session.save(userObj);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
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]
Run Code Online (Sandbox Code Playgroud)
我正在使用创建会话
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
Run Code Online (Sandbox Code Playgroud)
我也尝试session.clear()过保存之前,仍然没有运气.
这是第一次我收到用户请求时获取会话对象,所以我得到的原因是说会话中存在该对象.
有什么建议?
我想检查实体是否在另一个实体的Collection成员(@OneToMany或@ManyToMany)中:
if (entity2.getEntities1().contains(entity1)) { }
Run Code Online (Sandbox Code Playgroud)