我的项目使用的是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一次),但是别人的都挺好,怎么就我这个有问题呢!
请教啊,这个问题搞了一整天了,头疼死了
JPA Spring?Data?JPA Spring
------解决方案--------------------
如果他的都不好用了,那就自己封装吧,以前用hibernate的时候都是save前先merge一下
------解决方案--------------------
save内部是由persist和merge支持的,一直只调用persist,是不是所保存对象状态不对?
------解决方案--------------------
你当前save的对象不是通过Dao查出来的么?这里面没有包含List<Role>的信息(也就是这个集合为空)是嘛?