【问题标题】:Spring data with Hibernate Jpa does not commit on Weblogic使用 Hibernate Jpa 的 Spring 数据不会在 Weblogic 上提交
【发布时间】:2017-10-10 08:20:05
【问题描述】:

我能够让这个配置在 glassfish 上运行,但它在 Weblogic 12c 上不起作用/提交。

我没有任何异常,但它没有提交对数据库的更改。

有人有有效的配置吗?

我的 Pom 依赖项如下:

    <dependency>
        <groupId>weblogic</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>10.3.1</version>
    </dependency>

    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.3</version>
    </dependency>

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.2</version>
    </dependency>

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.2</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.hamcrest</groupId>
                <artifactId>hamcrest-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-library</artifactId>
        <version>1.3</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.3.0.RELEASE</version>
        <scope>test</scope>
        <type>jar</type>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-oracle</artifactId>
        <version>1.2.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>javax.ejb</groupId>
        <artifactId>ejb-api</artifactId>
        <version>3.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.11.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.11.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.11.Final</version>
    </dependency>

    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-core</artifactId>
        <version>4.1.4</version>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>4.1.4</version>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>

我的spring配置文件如下:

<beans>

<context:component-scan base-package="com.ericsson.noc"/>
<context:annotation-config />

<jpa:repositories base-package="com.ericsson.noc" />   

<jee:jndi-lookup id="dataSource" jndi-name="jdbc.ds"
        expected-type="javax.sql.DataSource" /> 


<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="showSql" value="true" />
    <property name="generateDdl" value="false" />
    <property name="database" value="ORACLE" />
    <property name="prepareConnection" value="false" /> 
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

    <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
    <property name="persistenceUnitName" value="oracle" />
    <!-- spring based scanning for entity classes -->
    <property name="packagesToScan" value="com.ericsson.noc" />
    <property name="persistenceXmlLocation" value="classpath:META-INF/jpa-persistence.xml" />
</bean>

<tx:jta-transaction-manager/>
<tx:annotation-driven/>

   <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

</beans>

我的 persistence.xml 调用结束 jpa-persistence.xml 如下:

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence              http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="oracle" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>jdbc.ds</jta-data-source> 
<class>xxx.yyy.Entity</class>
<exclude-unlisted-classes/>
<properties>
  <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
  <property name="hibernate.show_sql" value="true"/>
  <property name="hibernate.hbm2ddl.auto" value="validate"/>
  <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />
  <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
  <property name="hibernate.transaction.auto_close_session" value="true"/>  
  <property name="hibernate.transaction.factory_class"  value="jta"/>   
  <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.WeblogicJtaPlatform"/>
</properties>
</persistence-unit>
</persistence>

【问题讨论】:

  • 添加执行保存/更新的代码
  • @Transactional public void saveRole(String abbreviation, String description)throws BusinessException{ AmmRole ammRole = new AmmRole(); ammRole.setAbbreviation(缩写); ammRole.setDescription(描述); ammRole.setSysRole("N"); ammRole = ammRoleRepository.save(ammRole);} 其中 ammRoleRepository 是 spring-data 存储库,Transactional 的类型为 org.springframework.transaction.annotation.Transactional

标签: spring hibernate jpa spring-data-jpa weblogic12c


【解决方案1】:

也许我遗漏了一些东西,但我看不到您在哪里配置 TransactionManager 以供 Spring 使用。所以一个想法是,也许 Spring 和 Hibernate 使用不同的 TransactionManager,因此 Spring 提交事务对 Hibernate 没有影响。

所以要做的事情是:

  • 在您的 Spring 配置中包含 PlatformTransactionManager,看看这是否能解决问题
  • 如果它不检查 ApplicationContext 和 Hibernate 以查看它们是否引用相同的 TransactionManager

另请参阅:https://spring.io/blog/2011/08/15/configuring-spring-and-jta-without-full-java-ee/

【讨论】:

  • 嗨, 定义了一个 jta 事务管理器。我解决了这个问题,这是休眠端的错误配置。弹簧部分没问题。。
  • 旧帖子,我知道...但是您记得任何更改并知道这是什么错误配置问题吗?我有相同的症状并试图了解要查看的内容。谢谢。
猜你喜欢
  • 2023-03-21
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
相关资源
最近更新 更多