【问题标题】:Why is my local JPA setup not honored if using an EntityManagerFactory from JNDI using Spring?如果使用 Spring 使用来自 JNDI 的 EntityManagerFactory,为什么不支持我的本地 JPA 设置?
【发布时间】:2015-03-11 22:09:26
【问题描述】:

AuditingEntityListener 在我使用dev 模式(mvn jetty:run) 时正确更新标记为@LastModifiedDate@CreatedDate@CreatedBy@LastModifiedBy 的列。但是,当我激活 prod 配置文件并在 Wildfly 8 中部署时,这些列没有更新。

我在this forum post 上发现:“您将需要使用 Spring 的 EntityManagerFactoryBeans 之一来设置 EntityManagerFactory” 有什么方法可以将 AuditingEntityListener<jee:jndi-lookup /> 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" />

orm.xml

<?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>

【问题讨论】:

    标签: spring jpa spring-data spring-data-jpa wildfly-8


    【解决方案1】:

    tl;博士

    确保您从 JNDI 获得的 EntityManagerFactory 配置为将 AuditingEntityListener 应用于您获得的持久性单元。

    详情

    在您的 dev 配置文件中,EntityManagerFactory 是在您的应用程序中创建的,因此 - 根据规范中的定义 - 考虑本地可用的 orm.xml

    在您的prod 示例中,您不会在本地引导EntityManagerFactory,而是从应用服务器获取预配置的。因此,您首先必须确保 EntityManagerFactory 实例在应用程序服务器中按照您的预期进行配置。

    【讨论】:

    • 奥利弗,感谢您抽出宝贵时间。 AuditingEntityListener 已初始化,但 handlertouchForCreatetouchForUpdate 方法中为空,因此不会更新列。调试AuditingBeanFactoryPostProcessor 我看到BeanDefinitionUtils.getEntityManagerFactoryBeanNames 返回一个空的Set,因为BeanFactoryUtils.beanNamesForTypeIncludingAncestorsEntityManagerFactory.classAbstractEntityManagerFactoryBean.class 返回和空的Set
    猜你喜欢
    • 2015-06-15
    • 1970-01-01
    • 2019-04-19
    • 2015-10-02
    • 2015-10-31
    • 2013-10-17
    • 2017-10-22
    • 2018-08-24
    • 2018-03-31
    相关资源
    最近更新 更多