您现在的位置: 爱51代码网 >> 范文 >> 文章正文
java自动把其中的List<Role>所关联的多对多关系删除掉

我的项目使用的是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对象..

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 最新文章 热点文章 相关文章
    redhat 2.6 (santigo 5.6) vsftp
    shell如何实现自动填写操作执行下
    linux shell 文件配置sh:color:
    shell script语法一定要加path吗
    SecureCRT如何访问虚拟机vmWare中
    C#如何读取WINDOWS的放大系数
    cximge的图如何存入数据库并提取
    DBGRID控件显示查询结果文本类型
    TChart控件如何把表中右边的系列
    fastreport提示没有找到fr_class
    linux下编译faac及faad2提示 rec
    TClientDataSet如何避免多人更新
    如何用delphi代码修改XML节点
    vc++ pvoid *用delphi怎么表达
    GIS用百度行政区域的经纬度直接画
    不小心卸载了.net 4 extend,vs2
    C#byte【】里的数转换成string时
    C#的session取不到值
    java如何判断一个字符串里的数字
    随机找出24个不一样的字,在把一
    web.xml配置问题:"web-app" 
    json格式如何转换成javaBean
    page = (HtmlPage) webClien
    eclipse 3.7中安装SWT插件连
    java变量退出作用域会自动析
    easyui-datagrid url调用act
    jna调用dll无法加载动态库
    poi读取excel遇到空行怎么办
    计算一个字符串类型的四则运
    InputStream中read(b)和byte
     



    设为首页 | 加入收藏 | 网站地图 | 友情链接 |