这里有一些 关于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()
调用可能会返回不同的值,也就是(当正确实施)不在的感觉打破Object
API文档,但是当试图从检索改变实体引起的问题Map
, Set
或其他基于哈希的Collection
.因此,在某些情况下,JPA实现(至少EclipseLink)将无法正常工作. …
我有一个持久化实体对象的方法 persistData()。我有另一种方法 findData() ,它对持久化的主键值在同一个实体类上执行 find() 操作。当我在实体类的@PostPersist 中调用 findData() 时,我得到一个空指针异常。这在我的脑海中引发了几个问题:
任何进一步的见解也将不胜感激。请在下面找到相关代码和堆栈跟踪:
public void persistData(){
EntityManagerFactory fac= Persistence.createEntityManagerFactory("test");
EntityManager man = fac.createEntityManager();
Employee e = new Employee();
e.setEmpId(500);
e.setEmpName("Emp5");
e.setSalary(5000);
man.getTransaction().begin();
man.persist(e);
man.getTransaction().commit();
man.close();
}
public void findData(){
EntityManagerFactory fac= Persistence.createEntityManagerFactory("test");
EntityManager man = fac.createEntityManager();
Employee e=man.find(Employee.class, 500);
System.out.println(e.getEmpName());
man.close();
}
@PostPersist
public void getData(){
new Service().findData();
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪(部分):
Exception in thread "main" javax.persistence.RollbackException: java.lang.NullPointerException
at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit(EntityTransactionImpl.java:120)
at oracle.toplink.essentials.internal.ejb.cmp3.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:60)
at Service.persistData(Service.java:18)
at Service.main(Service.java:34)
Caused by: java.lang.NullPointerException
at …
Run Code Online (Sandbox Code Playgroud)