SpringData JPA 中的更新操作遇到问题

J2EE 码拜 9年前 (2015-04-11) 2429次浏览 0个评论

我的项目使用的是SpringMVC+Spring+HibernateJPA+SpringDataJPA
增、删、查全都没问题,但是在更新的时候却遇到问题了。

更新的处理流程是这样的:
1.用户发送更新操作的请求到Controller层,Controller层收集数据绑定到实体对象中(User)
2.调用Service层方法,把刚刚数据绑定的User对象传递进去
3.调用Dao层的save方法,保存。

这里有个问题:修改User的信息时,会自动把其中的List<Role>所关联的多对多关系删除掉(该属性没有设置级联操作)

我查了查问题,是因为User对象在被执行save时,该对象不是一个受托管的状态(它是被Controller自动绑定填充的对象)所以导致了List<Role>集合的数据被删掉。(如果在save之前先find一下把实体查出来,就不会删除List<Role>集合的数据了)

但问题是Dao层并不是我自己写的,是由SpringDataJPA自动生成的。它只提供了一个save方法,并没有update方法。按理说在执行SpringData的save方法时,它应该能根据实体对象的状态判断是执行JPA的persist()方法还是执行merge()方法,但是这里好像一直都是执行persist()方法,一直都把它当作新建操作来做的。

我看了看别人做的实例,也是这么来写的Controller的实体,直接调用Service,然后调用Dao更新。中间也没有什么其他的操作(比如再find一次),但是别人的都挺好,怎么就我这个有问题呢!

请教啊,这个问题搞了一整天了,头疼死了

SpringData JPA 中的更新操作遇到问题
30分
如果他的都不好用了,那就自己封装吧,以前用hibernate的时候都是save前先merge一下
SpringData JPA 中的更新操作遇到问题
30分
save内部是由persist和merge支持的,一直只调用persist,是不是所保存对象状态不对?

SpringData JPA 中的更新操作遇到问题
40分
你当前save的对象不是通过Dao查出来的么?这里面没有包含List<Role>的信息(也就是这个集合为空)是嘛?
SpringData JPA 中的更新操作遇到问题
spring data jpa 让人感觉就是白高心了一场;
我测试一对多关联映射时,也被这个save()搞得莫名其妙

在同一个事务下,明明在一的一端先save,然后再保存多的一端,
就是提示org.hibernate.TransientPropertyValueException: object references an unsaved transient instance – save the transient instance before flushing
但是在一的一端save之后 先load一下,再保存多的一端,一起就顺利了。

也不能参考 纯JPA中的 @ManyToOne中加(cascade = {CascadeType.ALL})
否则在一个事务下 多的一端加几次 一的一端就会重复几次插入数据

出现这些麻烦应该就是楼主说的spring data内部 save好像一直都是执行persist()方法

考虑放弃了

SpringData JPA 中的更新操作遇到问题
Spring Data JPA 的保存操作, 是根据状态来判断的. 如果没有经过load的过程, Spring Data JPA 都认为该对象是游离状态会执行保存操作; 如果需要更新必须先Load再设置属性后再Save.   这点确实有点小郁闷, 不知道大家有没有好点的方法来解决这个问题.
我看了下Spring Data JPA的例子, 在做更新操作时用了DTO对象进行数据传递, 在保存时再把DTO赋值给Domain对象..
SpringData JPA 中的更新操作遇到问题
springdata代码下载:http://www.zuidaima.com/share/search.htm?key=springdata
SpringData JPA 中的更新操作遇到问题
级联策略  cascade = {CascadeType.REFRESH}
SpringData JPA 中的更新操作遇到问题
User实体里

@OneToMany( cascade = {CascadeType.REFRESH} )
List <Role> roles;


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明SpringData JPA 中的更新操作遇到问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!