如果使用Spring使用JNDI的EntityManagerFactory,为什么我的本地JPA设置不受尊重?
如果使用Spring使用JNDI的EntityManagerFactory,为什么我的本地JPA设置不受尊重?,spring,jpa,spring-data,spring-data-jpa,wildfly-8,Spring,Jpa,Spring Data,Spring Data Jpa,Wildfly 8,AuditingEntityListener在使用LocalContainerEntityManagerFactoryBean时,在dev模式(mvn jetty:run)下正确更新标有@LastModifiedDate、@CreatedBy和@LastModifiedBy的列。但是,当我在Wildfly 8中激活prodprofile并部署时,列不会更新 我在上找到:“您需要使用Spring的EntityManagerFactoryBean之一来设置EntityManagerFactory”是
AuditingEntityListener
在使用LocalContainerEntityManagerFactoryBean
时,在dev
模式(mvn jetty:run
)下正确更新标有@LastModifiedDate
、@CreatedBy
和@LastModifiedBy
的列。但是,当我在Wildfly 8中激活prod
profile并部署时,列不会更新
我在上找到:“您需要使用Spring的EntityManagerFactoryBean之一来设置EntityManagerFactory”是否有任何方法可以将AuditingEntityListener
与EntityManagerFactory
一起使用
这是我的applicationContext.xml
<beans profile="dev">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${database.driver}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceXmlLocation" value="classpath:/META-INF/local-container-persistence.xml" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
</beans>
<beans profile="prod">
<jee:jndi-lookup id="dataSource" jndi-name="java:jboss/datasources/postgresql-datasource" lookup-on-startup="false" expected-type="javax.sql.DataSource" />
<jee:jndi-lookup id="entityManagerFactory" jndi-name="java:jboss/entity-manager-factory" lookup-on-startup="false" expected-type="javax.persistence.EntityManagerFactory" />
<tx:jta-transaction-manager />
</beans>
<jpa:repositories base-package="com.corp.repository" factory-class="com.corp.RespositoryFactoryBean" />
<jpa:auditing auditor-aware-ref="entityAuditorAware" />
<bean name="entityAuditorAware" class="com.corp.EntityAuditorAware" />
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
version="2.0">
<persistence-unit-metadata>
<persistence-unit-defaults>
<entity-listeners>
<entity-listener class="org.springframework.data.jpa.domain.support.AuditingEntityListener" />
</entity-listeners>
</persistence-unit-defaults>
</persistence-unit-metadata>
</entity-mappings>
tl;博士
确保从JNDI获取的EntityManagerFactory
配置为将AuditingEntityListener
应用于获取的持久化单元
细节
在您的dev
配置文件中,EntityManagerFactory
是在您的应用程序中创建的,因此根据规范中的定义,它考虑本地可用的orm.xml
在您的prod
示例中,您不会在本地引导EntityManagerFactory
,而是从应用程序服务器获取预配置的。因此,首先必须确保在应用程序服务器中按照预期配置了EntityManagerFactory
实例。Oliver,感谢您抽出时间AuditingEntityListener
被初始化,但touchForCreate
和touchForUpdate
方法中的handler
为空,因此列不会被更新。调试AuditingBeanFactoryPostProcessor
我看到BeanDefinitionUtils.getEntityManagerFactoryBeanNames
返回一个空的集合
,因为BeanFactoryUtils.BeanNamesfortype包含祖先
返回和空的集合
AbstractEntityManagerFactoryBean.class