采坑系列之JPA级联保存

springboot-jpa


踩过jpa多对多查询的坑之后,紧接着有跳进了级联保存的坑,真的很无语,继续爬。。。。


  • 本来以为保存就是一件简单的事,给对象添加内容,一键save就OK,现实却是关联数据丢三落四,只好深入的学习了。

  • 首先最最重要的就是@ManyToMany中的级联属性设置,如果你皮一下,没有写,那你就等着被自己蠢哭吧,比如我。。。实体类代码如下:

//维护端
public class User{
    //属性代码省略

    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
    @JoinTable(name = "user_addresses",
            joinColumns = {@JoinColumn(name = "user_id",referencedColumnName = "user_id")},
                inverseJoinColumns = {@JoinColumn(name = "address_id",referencedColumnName = "address_id")})
    private Set
addresses = new HashSet<>(); }
被维护方
public class Address{
    //属性代码省略

    @ManyToMany(mappedBy = "addresses")
    @JsonIgnore
    private Set users = new HashSet<>();

}
  • 开始我只在维护端设置的级联属性(Cascade.ALL),然后通过维护端进行保存,很顺利,User表、Address表、user_addresses关联表都能保存,代码如下,没毛病。
 public User save(){
        Address address = new Address();
        address.setAddressName("北京海淀");
        User user1 = new User();
        user1.setName("阿伟");
        user1.getAddresses().add(address);
        return UserService.save(User1);
    }

我换了个思路,从被维护端能不能进行保存,然后就立即进行尝试,代码如下:

   public Address save(){
        Address address = new Address();
        address.setAddressName("北京海淀");
        User user1 = new User();
        user1.setName("阿伟");
        address.getUsers().add(user1);
        return addressService.save(address);
    }

结果,但我以为能够成功的时候,发现只保存了Address一张表,还没报错,就是User表和关联表死活没有数据,此时就是上面所说的被自己蠢哭的地方,我没有在被维护端(即Address类)中设置级联属性。。。。好了,发现问题及时修改,如下:

    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER,mappedBy = "addresses")
    private Set users = new HashSet<>();

修改之后,在进行一次操作,结果两个实体表都能插入数据,只是关联表没有,啊。。。自己都快疯了,这是为什么?
这里写图片描述

没办法,又是一顿的查询,研究文档,终于找到原因了,由被维护端发起操作的时候,需要为关联类属性添加彼此,感觉真是关联到“恩爱”的地步了,如下:

 public Address save(){
        Address address = new Address();
        address.setAddressName("唐山一中");
        User user1 = new User();
        user1.setName("阿伟");
        user1.setHeight("170");
        user1.setSex("1");
        //在彼此定义对方类集合中添加
        user1.getAddresses().add(address);
        address.getUsers().add(user1);

        return addressService.save(address);
    }

采坑系列之JPA级联保存_第1张图片
终于保存成功了,觉得很艰辛,但是最后的结果还是让自己满意的。

  • 最后希望大家能够通过我的一些分享少走几个弯路,少跳几个坑。

你可能感兴趣的:(springboot学习)