JPA @PostPersist 用法

2024-01-11

我有一个持久化实体对象的方法 persistData() 。我有另一个方法 findData() ,它对同一实体类执行 find() 操作以获取持久的主键值。当我在实体类的@PostPersist中调用findData()时,出现空指针异常。这在我心中提出了几个问题:

  1. 为什么会出现空指针错误?
  2. @PostPersist在现实中有什么用呢?
  3. @Postpersist 何时被真正调用?提交之后、提交期间还是提交之前?

任何进一步的见解也将不胜感激。请在下面找到相关代码和堆栈跟踪:

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();
}

堆栈跟踪(部分):

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)

Note:我使用的是 JPA 1.0


回答你的问题1:

(需要代码和堆栈跟踪)

回答你的问题2:

@PostPersist 表示 JPA 回调方法。它允许您通过实体生命周期事件触发一些代码。

现实生活中的例子?

假设您有一个 User 表,并且您希望在每次保留新用户时生成确认电子邮件:您可以在后坚持 method.

回答你的问题3:

规范的相关部分已融入血液。

来自 JPA-2.0 规范:

在实体被持久化或删除后,将调用该实体的 PostPersist 和 PostRemove 回调方法。这些回调还将在这些操作级联到的所有实体上调用。 PostPersist 和 PostRemove 方法将分别在数据库插入和删除操作后调用。这些数据库操作可以在调用持久、合并或删除操作之后直接发生,也可以在刷新操作发生之后(可能在事务结束时)直接发生。生成的主键值可在 PostPersist 方法中使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA @PostPersist 用法 的相关文章

随机推荐