我的项目使用的是SpringMVC+Spring+HibernateJPA+SpringDataJPA, 更新的处理流程是这样的: 这里有个问题:修改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一次),但是别人的都挺好,怎么就我这个有问题呢! 请教啊,这个问题搞了一整天了,头疼死了 |
|
30分 |
如果他的都不好用了,那就自己封装吧,以前用hibernate的时候都是save前先merge一下
|
30分 |
save内部是由persist和merge支持的,一直只调用persist,是不是所保存对象状态不对?
|
40分 |
你当前save的对象不是通过Dao查出来的么?这里面没有包含List<Role>的信息(也就是这个集合为空)是嘛?
|
spring data jpa 让人感觉就是白高心了一场;
我测试一对多关联映射时,也被这个save()搞得莫名其妙 在同一个事务下,明明在一的一端先save,然后再保存多的一端, 也不能参考 纯JPA中的 @ManyToOne中加(cascade = {CascadeType.ALL}) 出现这些麻烦应该就是楼主说的spring data内部 save好像一直都是执行persist()方法 考虑放弃了 |
|
Spring Data JPA 的保存操作, 是根据状态来判断的. 如果没有经过load的过程, Spring Data JPA 都认为该对象是游离状态会执行保存操作; 如果需要更新必须先Load再设置属性后再Save. 这点确实有点小郁闷, 不知道大家有没有好点的方法来解决这个问题.
我看了下Spring Data JPA的例子, 在做更新操作时用了DTO对象进行数据传递, 在保存时再把DTO赋值给Domain对象.. |
|
级联策略 cascade = {CascadeType.REFRESH}
|
|
User实体里
@OneToMany( cascade = {CascadeType.REFRESH} ) |