JPA@PostPersist用法

JPA@PostPersist用法,jpa,callback,lifecycle,Jpa,Callback,Lifecycle,我有一个持久化实体对象的方法persistData()。我有另一个方法findData(),它对保存的主键值在同一实体类上执行find()操作。当我在entity类的@PostPersist中调用findData()时,我得到一个空指针异常。这在我脑海中提出了几个问题: 为什么会出现空指针错误 @PostPersist在现实中有什么用途 @Postpersist实际上是什么时候调用的?提交之后、提交期间还是提交之前 任何进一步的见解也将不胜感激。请在下面查找相关代码和堆栈跟踪: public v

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

  • 为什么会出现空指针错误
  • @PostPersist在现实中有什么用途
  • @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();
    }
    
    堆栈跟踪(部分):


    注意:我用JPA1.0来回答你的问题1:

    (需要代码和stacktrace)

    要回答你的问题2:

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

    一个真实的例子

    假设您有一个用户表,并且希望在每次新用户被持久化时生成一封确认电子邮件:您可以使用PostPersist方法来完成

    要回答你的问题3:

    规范的相关部分以blod为单位

    来自JPA-2.0规范:

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


    我正在使用的@PostPersist的一个真实例子是-- 我正在创建一个任务管理系统。在这个任务管理系统中,任务被分配给一个代理。然而,当任务未获得代理时,可能会出现由源系统自动分配代理的情况。在这个场景中,每当任务被持久化并且任务分配引擎侦听该事件并进行处理时,我就会触发一个事件。
    我确信还有其他方法可以做同样的事情,但我认为这种异步方式可以从性能角度改善系统。

    发布postPersist方法+stacktrace它将帮助我们帮助您使用哪个版本的toplink?行在哪里:Service.java:28Service:18-man.getTransaction.commit();服务:28-System.out.println(e.getEmpName());员工:33-新服务().findData()@pospersist我知道@pospersist的工作。但我想知道一个真实的例子。此外,规范中还规定了“持久化后”。这是否意味着在commit()结束之后?正如指定的:它可能直接发生在persist()方法返回之后,也可能直接发生在flush()方法返回之后。因此,这似乎取决于您的事务配置(即,在第一个或第二个行为之间进行选择)
    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)