cod*_*ash 4 lifecycle jpa callback
我有一个持久化实体对象的方法 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 Service.findData(Service.java:28)
at Employee.getData(Employee.java:33)
Run Code Online (Sandbox Code Playgroud)
注意:我使用的是 JPA 1.0
回答你的问题1:
(需要代码和堆栈跟踪)
回答你的问题2:
@PostPersist 表示 JPA 回调方法。它允许您通过实体生命周期事件触发一些代码。
一个现实生活中的例子?
假设您有一个 User 表,并且希望在每次持久化新用户时生成确认电子邮件:您可以在PostPersist方法中执行此操作。
回答你的问题3:
规范的相关部分是血腥的。
从 JPA-2.0 规范:
PostPersist 和 PostRemove 回调方法在实体被持久化或删除后被调用。这些回调也将在这些操作级联到的所有实体上调用。PostPersist 和 PostRemove 方法将分别在数据库插入和删除操作之后被调用。这些数据库操作可能在调用持久化、合并或删除操作之后直接发生,也可能在刷新操作发生后(可能在事务结束时)直接发生。生成的主键值在 PostPersist 方法中可用。
| 归档时间: |
|
| 查看次数: |
16727 次 |
| 最近记录: |