小编典典

如何在EntityListeners中注入EntityManager

spring-mvc

我需要在EntityListener类中注入EntityManager,以便可以对其执行CRUD操作。

POJO:

@Entity
@EntityListner(AuditLogging.class)
class User
{
      //Getter / setter of properties
}

AuditLogging(侦听器类)

public class AuditInterceptor
{

  @PersistenceContext
  EntityManager entityManager;

  public void setEntityManager(EntityManager entityManager)
  {
    this.entityManager = entityManager;
  }

  @PrePersist
  public void prePersist(Object obj)
  {
     // Here I want to use ENTITY manager object so that I can perform CRUD operation
     // with prePersist coming object.

      entityManager.unwrap(Session.class).save(obj);

     // But I am getting NULL POINTER EXCEPTION for entity manager object 
   }

}

JDBC-CONFIg.xml

<bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
        <property name="packagesToScan" value="com.XXXXX.entity" />
        <property name="jpaProperties">
    </bean>

<!-- Datasource -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass" value="${jdbc.driver.classname}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
    </bean>


<!-- transaction Manager -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

EntityListener不受任何容器的管理。EntityListeners由JPA实例化,因此Spring没有机会注入EntityManager。我的问题是,我们如何在EntityListener类中注入EntityManager,以便可以对其执行CRUD操作?


阅读 759

收藏
2020-06-01

共1个答案

小编典典

无论如何,我是通过从EntityManagerFactory配置在bean中的bean 获取entityManager引用来完成此操作的jdbc- config.xml。但这又不是我想要的。我想和一起工作@PersistenceContext

  @Autowired
  EntityManagerFactory entityManagerFactory;

  private static EntityManager entityManager;

  public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
    entityManager=entityManagerFactory.createEntityManager();
    this.entityManagerFactory = entityManagerFactory;
  }

以下是我们需要记住的一些注意事项:

  1. 我们无法将插入EntityManagerEntityListener(通过 @PersistenceContext)。EntityListener不受任何容器管理
  2. @PersistenceContext类不能是静态的。所以我们不能在类加载时获得实例。
  3. EntityListeners由JPA实例化,因此Spring没有机会注入 EntityManager
2020-06-01