首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JBoss上的Spring Data JPA -数据未写入数据库

JBoss上的Spring Data JPA -数据未写入数据库
EN

Stack Overflow用户
提问于 2018-03-23 20:43:07
回答 2查看 63关注 0票数 0

我正在缓慢地将一个大型项目从EJB实体bean升级到Spring Data JPA。最初的工作是使用Spring Data 1.6.6,JPA 2.0,Spring Framework 3.2.14。我有一些beans转换,并将在单元测试与H2数据库的工作。

现在我正在尝试部署到JBoss 5.2,但数据没有提交到数据库中。我有一个EntityListener,调用了PrePersist方法,但PostPersist没有。因此,不知何故,Hibernate将它们作为托管bean,但它们从未提交到数据库中。我尝试添加具有不同传播的@Transaction,但实体仍未写入数据库。我假设我的配置不知何故缺少实体管理器到事务的连接。我研究了其他帖子,但没有找到任何有效的组合。下面是我的配置:

代码语言:javascript
复制
    <!-- Create default configuration for Hibernate -->
<bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="databasePlatform" value="${hibernate.dialect:org.hibernate.dialect.Oracle10gDialect}"/>
    <property name="showSql" value="false"/>
</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="springbatch.repositoryDataSource" />
    <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
            <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>
            <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</prop>
            <prop key="hibernate.transaction.auto_close_session">true </prop>
            <prop key="hibernate.current_session_context_class">jta</prop>
            <prop key="hibernate.connection.release_mode">auto</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.transaction.jta.platform">org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform</prop>
        </props>
    </property>
    <property name="packagesToScan">
        <list>
            <value>com.*</value>
        </list>
    </property>
</bean>

<!-- Transaction Manager -->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManagerName" value="java:/TransactionManager" />
    <property name="userTransactionName" value="UserTransaction" />
    <property name="allowCustomIsolationLevels" value="true"/>
</bean>

<jpa:repositories base-package="com.*" factory-class="com.stoneriver.powersuite.persistence.repository.BaseRepositoryFactoryBean" />

<!-- bean post-processor for JPA annotations -->
<bean id="persistenceExceptionTranslationPostProcessor"
    class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

<!-- bean post-processor for JPA annotations -->
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

有人能给我一些建议吗?

谢谢

下面是保存1实体的日志:

代码语言:javascript
复制
2018-03-25 16:45:49,826 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] (http-0.0.0.0-8080-9) Participating in existing transaction
2018-03-25 16:45:49,828 TRACE [org.springframework.transaction.support.TransactionSynchronizationManager] (http-0.0.0.0-8080-9) Initializing transaction synchronization
2018-03-25 16:45:49,830 TRACE [org.springframework.transaction.interceptor.TransactionInterceptor] (http-0.0.0.0-8080-9) Getting transaction for [com.stoneriver.powersuite.persistence.repository.BaseRepositoryImpl.save]
2018-03-25 16:45:49,832 DEBUG [org.springframework.orm.jpa.EntityManagerFactoryUtils] (http-0.0.0.0-8080-9) Opening JPA EntityManager
2018-03-25 16:45:49,838 DEBUG [org.springframework.orm.jpa.EntityManagerFactoryUtils] (http-0.0.0.0-8080-9) Registering transaction synchronization for JPA EntityManager
2018-03-25 16:45:49,841 TRACE [org.springframework.transaction.support.TransactionSynchronizationManager] (http-0.0.0.0-8080-9) Bound value [org.springframework.orm.jpa.EntityManagerHolder@71f03e27] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@7bcd0210] to thread [http-0.0.0.0-8080-9]
2018-03-25 16:45:49,848 INFO  [com.stoneriver.powersuite.persistence.listeners.RecordIdEntityListener] (http-0.0.0.0-8080-9) onPrePersist : com.taliantsoftware.rulesengine.conditionevaluator.ejb.ExpressionBean .... id: 10032005
2018-03-25 16:45:49,923 INFO  [com.stoneriver.powersuite.persistence.repository.BaseRepositoryImpl] (http-0.0.0.0-8080-9) Saved ExpressionBean with Id : 10032005
2018-03-25 16:45:49,926 TRACE [org.springframework.transaction.interceptor.TransactionInterceptor] (http-0.0.0.0-8080-9) Completing transaction for [com.stoneriver.powersuite.persistence.repository.BaseRepositoryImpl.save]
2018-03-25 16:45:49,928 TRACE [org.springframework.transaction.jta.JtaTransactionManager] (http-0.0.0.0-8080-9) Triggering beforeCommit synchronization
2018-03-25 16:45:49,929 TRACE [org.springframework.transaction.jta.JtaTransactionManager] (http-0.0.0.0-8080-9) Triggering beforeCompletion synchronization
2018-03-25 16:45:49,931 TRACE [org.springframework.transaction.support.TransactionSynchronizationManager] (http-0.0.0.0-8080-9) Removed value [org.springframework.orm.jpa.EntityManagerHolder@71f03e27] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@7bcd0210] from thread [http-0.0.0.0-8080-9]
2018-03-25 16:45:49,933 DEBUG [org.springframework.orm.jpa.EntityManagerFactoryUtils] (http-0.0.0.0-8080-9) Closing JPA EntityManager
2018-03-25 16:45:49,935 TRACE [org.springframework.transaction.jta.JtaTransactionManager] (http-0.0.0.0-8080-9) Triggering afterCommit synchronization
2018-03-25 16:45:49,936 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] (http-0.0.0.0-8080-9) Registering after-completion synchronization with existing JTA transaction
2018-03-25 16:45:49,938 TRACE [org.springframework.transaction.support.TransactionSynchronizationManager] (http-0.0.0.0-8080-9) Clearing transaction synchronization
2018-03-25 16:45:49,941 TRACE [org.springframework.transaction.support.TransactionSynchronizationManager] (http-0.0.0.0-8080-9) Removed value [org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$DefaultCrudMethodMetadata@a2d7c25] for key [public abstract java.lang.Object com.stoneriver.powersuite.persistence.repository.BaseRepository.save(java.lang.Object)] from thread [http-0.0.0.0-8080-9]
EN

回答 2

Stack Overflow用户

发布于 2018-03-23 23:36:09

听起来您遇到了一个典型的JPA挑战: JPA在flush-event (也包含在提交中)之前几乎什么也不做。因此,您需要在测试中添加一些事务管理。

最简单的方法可能是使用Spring Test Runner,如果您想在测试@Rollback(false)之后保持数据库状态

票数 0
EN

Stack Overflow用户

发布于 2018-04-10 04:59:21

在阅读了我使用的版本的hibernate源代码后,这些更改解决了问题。

代码语言:javascript
复制
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jtaDataSource" ref="springbatch.repositoryDataSource" />
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
<property name="jpaProperties">
    <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
        <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>
        <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</prop>
        <prop key="hibernate.transaction.auto_close_session">true </prop>
        <prop key="hibernate.current_session_context_class">jta</prop>
        <prop key="hibernate.connection.release_mode">auto</prop>
        <prop key="hibernate.show_sql">true</prop>
        <prop key="hibernate.format_sql">true</prop>
        <prop key="hibernate.transaction.jta.platform">org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform</prop>
    </props>
</property>
<property name="packagesToScan">
    <list>
        <value>com.*</value>
    </list>
</property>

具体来说

代码语言:javascript
复制
<property name="jtaDataSource" ref="springbatch.repositoryDataSource" />

代码语言:javascript
复制
<prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</prop>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49449953

复制
相关文章

相似问题

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