我需要将EntityManager注入EntityListener类,以便对其执行CRUD操作。
波霍:
@Entity
@EntityListner(AuditLogging.class)
class User
{
//Getter / setter of properties
}AuditLogging (Listner类)
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不是由JPA实例化的任何一个container.EntityListeners管理的,所以Spring没有机会注入EntityManager。我的问题是,我们如何将EntityManager注入到EntityListener类中,以便对其执行CRUD操作?
发布于 2014-03-05 08:00:11
无论如何,我是通过从配置在我的entityManager中的EntityManagerFactory bean获得EntityManagerFactory引用来完成这一任务的。但这也不是我想要的。我想和@PersistenceContext一起工作。
@Autowired
EntityManagerFactory entityManagerFactory;
private static EntityManager entityManager;
public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
entityManager=entityManagerFactory.createEntityManager();
this.entityManagerFactory = entityManagerFactory;
}以下是我们需要记住的几个注意事项:
EntityManager注入EntityListener (通过@PersistenceContext)。EntityListener不是由任何容器管理的。@PersistenceContext类不能是静态的。因此,在加载类时无法获得实例。EntityManager发布于 2017-02-14 09:40:49
我遇到了一个类似的问题,我试图使用EntityListeners为一个实体创建历史记录。
为了解决这个问题,我使用静态方法创建了实用程序类BeanUtil来获取bean,并使用这个util类在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,以了解更多信息,您可以阅读我的文章JPA审计:使用EntityListeners自动保存审计日志。
发布于 2014-03-04 22:07:20
嗯,我脑海中出现的第一个解决方案是一些“黑客”,但应该有效。
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)
https://stackoverflow.com/questions/22171221
复制相似问题