gpt4 book ai didi

java - 如何在 EntityListeners 中注入(inject) EntityManager

转载 作者:搜寻专家 更新时间:2023-11-01 01:12:54 24 4
gpt4 key购买 nike

我需要在 EntityListener 类中注入(inject) 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 不由任何容器管理。EntityListener 由 JPA 实例化,因此 Spring 没有机会注入(inject) EntityManager。我的问题是,我们如何在 EntityListener 类中注入(inject)注入(inject) EntityManager 以便我可以对其执行 CRUD 操作???

最佳答案

我在尝试使用 EntityListeners 为实体创建历史记录时遇到了类似的问题。

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

@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

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 管理的 bean,要了解更多信息,您可以阅读我的文章 JPA Auditing: Persisting Audit Logs Automatically using EntityListeners .

关于java - 如何在 EntityListeners 中注入(inject) EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22171221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com