首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在EntityManager中注入EntityListeners

如何在EntityManager中注入EntityListeners
EN

Stack Overflow用户
提问于 2014-03-04 11:53:52
回答 4查看 8.5K关注 0票数 5

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

波霍:

代码语言:javascript
复制
@Entity
@EntityListner(AuditLogging.class)
class User
{
      //Getter / setter of properties
}

AuditLogging (Listner类)

代码语言:javascript
复制
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

代码语言:javascript
复制
<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不是由JPA实例化的任何一个container.EntityListeners管理的,所以Spring没有机会注入EntityManager。我的问题是,我们如何将EntityManager注入到EntityListener类中,以便对其执行CRUD操作?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-05 08:00:11

无论如何,我是通过从配置在我的entityManager中的EntityManagerFactory bean获得EntityManagerFactory引用来完成这一任务的。但这也不是我想要的。我想和@PersistenceContext一起工作。

代码语言:javascript
复制
  @Autowired
  EntityManagerFactory entityManagerFactory;

  private static EntityManager entityManager;

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

以下是我们需要记住的几个注意事项:

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

Stack Overflow用户

发布于 2017-02-14 09:40:49

我遇到了一个类似的问题,我试图使用EntityListeners为一个实体创建历史记录。

为了解决这个问题,我使用静态方法创建了实用程序类BeanUtil来获取bean,并使用这个util类在Entitylistener类中获取bean

代码语言:javascript
复制
@Service
public class BeanUtil implements ApplicationContextAware {

    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }

    public static <T> T getBean(Class<T> beanClass) {
        return context.getBean(beanClass);
    }

}

现在我们可以调用BeanUtil.getBean()来获取任何类型的bean

代码语言:javascript
复制
public class FileEntityListener {

    @PrePersist
    public void prePersist(File target) {
        perform(target, INSERTED);
    }

    @Transactional(MANDATORY)
    private void perform(File target, Action action) {
        EntityManager entityManager = BeanUtil.getBean(EntityManager.class);
        entityManager.persist(new FileHistory(target, action));
    }

}

我们可以使用这个BeanUtil类从任何地方获取任何spring,以了解更多信息,您可以阅读我的文章JPA审计:使用EntityListeners自动保存审计日志

票数 10
EN

Stack Overflow用户

发布于 2014-03-04 22:07:20

嗯,我脑海中出现的第一个解决方案是一些“黑客”,但应该有效。

代码语言:javascript
复制
    public class AuditInterceptor {

        static setEntityManager emf; 

        @Autowired
        public void setEntityManagerFactory(EntityManager emf) {
            AuditInterceptor.emf = emf;
        }

        @PrePersist
        public void prePersist(Object obj) { 
            EntityManager entityManager = emf.getEntityManager();
            // 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 
       }
   }

在代码中使用EntityManager entityManager = emf.getEntityManager()

AuditInterceptor声明为spring (带有组件扫描的@Component或将AuditorInterceptor定义为bean)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22171221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档