spring+jpa开发,事务管理遇问题,求解决-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

spring+jpa开发,事务管理遇问题,求解决

2016-03-03 11:29:34 2239 1

最近用到spring +jpa eclipselink+ struts做开发,遇到一个无解的问题,业务层中一个用事务管理的方法中,一个受管的对象(fh)更新其一个复杂型属性(country)时居然会将country重新插入到数据库。!!!

public String updateSsss(){
Farmhouse fh = farmDao.findById(xxx);//前提1
// Farmhouse fh = new Farmhouse();//前提2
Country country = countryDao.findById(yyy);//行3
fh.setCountry(country);//关键行4
farmDao.update(fh);//行5
}

这个方法用事务管理了的,首先行5注释与否不影响结果,然后如果选择前提2的话,正常执行;如果选择前提1的话,它会将country的内容重新insert一次,导致问题的是关键行4(如果注释则不会有问题),当然,最终主键重复了插不进去,事务也回滚了。
简单说就是如果对象已存在, 更改它的关联对象就会引发插入。
小生封装了一个基本的DAO方法,其中update内部执行persist(); farmDao,countryDao都是继承基本DAO。
我附上spring事务配置代码:

<bean
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="jpaDialect" 
    class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect " /> 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
    <property name="username" value="root"/>
    <property name="password" value="111111"/>
    <property name="url" value="jdbc:mysql://111.16.253.66:3306/XXX"/>
</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" />
    <property name="jpaDialect" ref="jpaDialect" /> 
    <property name="jpaVendorAdapter">
        <bean
            class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
            <property name="database" value="MYSQL" />
            <property name="showSql" value="true" />
            <property name="databasePlatform" value="org.eclipse.persistence.platform.database.MySQLPlatform" /> 
        </bean>
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <property name="nestedTransactionAllowed" value="true"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
   <tx:attributes>
        <tx:method name="submit*" />
        <tx:method name="add*" />
        <tx:method name="delete*" />
        <tx:method name="update*" />
   </tx:attributes>
</tx:advice>

<aop:config>
  <aop:pointcut id="pointcut"  
    expression="execution(* service.impl.*.*(..))" />
  <aop:advisor advice-ref="txAdvice"
    pointcut-ref="pointcut" />
</aop:config>  
取消 提交回答
全部回答(1)
  • 小旋风柴进
    2019-07-17 18:51:08

    是因为findById( id )这个函数里面,忘了将用完的EntityManager clear一下

    0 0
相关问答

1

回答

Spring使用JPA,数据提交无效 : 配置报错 

2020-06-04 13:11:49 411浏览量 回答数 1

1

回答

Spring Boot 2.5 实战开发 REST API,如何模拟淘宝订单接口?

2021-12-23 16:57:32 438浏览量 回答数 1

1

回答

Spring Boot的特点是什么?

2021-11-09 22:32:16 192浏览量 回答数 1

0

回答

Spring Boot支持哪些构建工具?

2021-11-09 22:37:19 101浏览量 回答数 0

0

回答

请问在Java程序性能优化中,Spring Boot 如何进行内部运行JVM参数调优?

2021-11-06 20:53:33 150浏览量 回答数 0

2

回答

如何实现 Spring Boot 应用程序的安全性?

2021-10-24 16:41:01 253浏览量 回答数 2

1

回答

Spring Boot 中如何解决跨域问题 ?

2021-10-24 20:31:13 163浏览量 回答数 1

1

回答

在Spring Boot中怎么禁用Actuator端点安全性?

2021-10-24 20:37:04 246浏览量 回答数 1

1

回答

spring boot启动报错org.springframework.beans?400报错

2020-06-06 15:38:17 895浏览量 回答数 1

4

回答

EDAS结合Spring Boot启动出现数据库加载异常

2017-09-11 11:31:18 7792浏览量 回答数 4
2709
文章
6591
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载