JPA @PostPersist用法

问题描述 投票:4回答:2

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

  1. 为什么会给出空指针错误?
  2. @ PostPersist在现实中有什么用?
  3. @ Postpersist何时被实际致电?提交之后,提交期间还是提交之前?

任何其他见解也将不胜感激。请在下面找到相关的代码和stacktrace:

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)

:我正在使用JPA 1.0

jpa callback lifecycle
2个回答
4
投票

回答您的问题1:

(需要代码和堆栈跟踪)

回答您的问题2:

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

一个真实的例子?

假设您有一个User表,并且您想在每次新用户持久化时都生成一封确认电子邮件:您可以通过PostPersist方法进行操作。

回答您的问题3:

规格的相关部分是blod。

根据JPA-2.0规范:

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


0
投票

我正在使用的@PostPersist的一个现实示例是-我正在创建一个任务管理系统。在此任务管理系统中,任务已分配给代理。但是,在某些情况下,源系统会自动分配任务而没有获得代理。在这种情况下,每当任务持续存在并且任务分配引擎侦听该事件并进行处理时,我都会触发一个事件。我敢肯定,还有其他方法可以做同样的事情,但是我认为这种异步方法从性能的角度使系统变得更好。

© www.soinside.com 2019 - 2024. All rights reserved.