相信大部分java小伙伴在日常开发过程中,在存储操作层都会选择更容易上手的jpa,各种封装,通过注解等方式,简化了大量的代码内容,同时提升了开发效率,但是(敲黑板,永远都躲不开的但是...)相应也将一些问题隐藏,需要更多的时间去理解、分析才能找到病根。
JPA简介
JPA全称(Java Persistence API),通常叫持久层API。它提供面向对象的编程模型,让使用者更容易理解与上手;底层也提供了通用接口,可以实现与其它框架快速集成。下面整理一些基础概念,不了解的可以参考下:
目前小编所开发项目的数据持久层大部分采用的是Spring Data JPA,经过长时间的使用验证,发现出了级联保存问题,即调用repository的save方法后,发现数据结果却是“丢三落四”,这就很让人脑袋疼,下面结合代码一起分析下
//维护端
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< Address > addresses = new HashSet< >();
}
//被维护方
public class Address{
//属性代码省略
@ManyToMany(mappedBy = "addresses")
@JsonIgnore
private Set< User > users = new HashSet< >();
}
// 维护端操作
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);
}
@ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER,mappedBy = "addresses")
private Set< User > 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的坑,这就是小编最骄傲的事情。每一条道路上都是坑洼不平的,有些时候可能会掉入坑里,希望每个人都能重新站起来,跳过阻挡你的“坑”,最终会收获到很多,让自己变得更强。
全部0条评论
快来发表一下你的评论吧 !