我的项目使用的是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一次),但是别人的都挺好,怎么就我这个有问题呢!
请教啊,这个问题搞了一整天了,头疼死了 如果他的都不好用了,那就自己封装吧,以前用hibernate的时候都是save前先merge一下 save内部是由persist和merge支持的,一直只调用persist,是不是所保存对象状态不对? 你当前save的对象不是通过Dao查出来的么?这里面没有包含List<Role>的信息(也就是这个集合为空)是嘛? Spring Data JPA 的保存操作, 是根据状态来判断的. 如果没有经过load的过程, Spring Data JPA 都认为该对象是游离状态会执行保存操作; 如果需要更新必须先Load再设置属性后再Save. 这点确实有点小郁闷, 不知道大家有没有好点的方法来解决这个问题. 我看了下Spring Data JPA的例子, 在做更新操作时用了DTO对象进行数据传递, 在保存时再把DTO赋值给Domain对象..
|