入坑记(1)【jpa级联更新】

    好久没有写博客了,近期将写一些关于程序入坑、spring boot、dubbo等方面的文章,欢迎大家关注。

现在有一个这样需求,就是前端页面表单选择用户名,将用户id存入当前表单,用户表不做任何改变,也就是当更新主表时,子表不更新,仅把子表的id存入父表中。

当我们做级联查询时,通过OneToOne和OnoToMany等注解可以解决查询映射到对象问题,并能顺利顺利查询到数据,但我们做更新时可能会遇到报500的错误,开始百思不得其解。我们来看看以下的报错信息:

   

org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: com.xxx.domain.p.User; nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.xxx.domain.p.User

如图:

   

原代码:

@ApiModelProperty(value = "用户id",example = "-")
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id",referencedColumnName = "id",columnDefinition = "varchar(64) DEFAULT NULL COMMENT '线索ID'")
private User user;

   

    经过百度和谷歌,搜索上说是因为我更新了或插入了关联表数据的原因.

网上的解决方案:

  1. CascadeType.ALL改为CascadeType. MERGE或CascadeType.REFRESH。
  2. 去掉id生成策略,或者不传id。

至于第2条,将业务需要我们是不能做的,因为子表不做任何改变的,所以只能将第1条改联系关系的方法,我将级关系改为CascadeType. MERGE。

但实际并没有什么卵用,依然报错,不过是新的错误:

    按错误意思是不能更新和新建子表。

    后来无数个百度和谷歌,都没有找到答案。

    只有自己尝试动手想办法,慢慢调。

    首先想到的是OneToOne注解,一看这个注解的属性都没有与表操作的属性。

    后来在JoinColumn看到的与表操作的属性:insertable 和updatable。我分别 设置insertable = false,updatable = true,问题就解决了。

      

    最终代码:

@ApiModelProperty(value = "用户id",example = "-")
@OneToOne(cascade = CascadeType.
MERGE)
@JoinColumn(name = "user_id",referencedColumnName = "id",columnDefinition = "varchar(64) DEFAULT NULL COMMENT '线索ID'",insertable = false,updatable = true)
private User user;

   

午间匆匆发布,若有渗漏,请帮忙在评论区斧正,谢谢。

转载于:https://www.cnblogs.com/javalittleman/p/9288396.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值