当前位置: 首页 > 科技观察

逃不过JPA的坑的层叠保存

时间:2023-03-19 20:52:46 科技观察

大家好,我说的是北军。又是崭新的一周,也是踩坑的开始,还是先洗涤一下自己的心灵吧。失败者的弱点之一就是放弃。成功的必由之路就是不断重复。-托马斯·爱迪生。是不是心动了,马上开始今天的分享吧~前言相信大部分java小伙伴都会选择jpa,在存储操作层,在日常开发过程中,各种封装,通过注解简化了很多工作代码内容在提高开发效率的同时,但是(敲黑板,永远避不开。。。)相应的,也隐藏了一些问题,需要更多的时间去理解和分析,才能找到根本原因。JPA简介JPA(JavaPersistenceAPI)的全称,通常称为持久层API。它提供了面向对象的编程模型,使用户更容易理解和上手;底层还提供了一个通用的接口,可以实现与其他框架的快速集成。下面整理一些基本概念。不明白的可以参考:JPA是一种ORM规范。Hibernate是JPA的一个子集。SpringDataJPA是JPA的代码实现,底层采用Hibernate技术实现。JPA实战-级联操作目前小编开发的项目的数据持久层大多采用SpringDataJPA。经过长时间的使用和验证,发现一个级联存储问题,即在调用了repository的save方法后,发现数据的结果是“丢失丢失”,非常痛苦。下面结合代码来分析一下。代码场景:用户和地址是多对多的关系。JPA中通常使用@ManyToMany注解来描述这种关系,首先是创建一个对象;//维护端publicclassUser{//属性代码省略@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")})privateSet

addresses=newHashSet<>();}//维护方公共类Address{//属性代码省略@ManyToMany(mappedBy="addresses")@JsonIgnoreprivateSetusers=newHashSet<>();}一开始我只在维护端设置级联属性(Cascade.ALL),然后然后通过维护方将其保存。一切顺利。User表、Address表、user_addresses关联表都可以Save,代码如下,没有错。//维护操作publicUsersave(){Addressaddress=newAddress();address.setAddressName("北京海淀");用户user1=newUser();user1.setName("阿伟");user1.getAddresses().add(地址);returnUserService.save(User1);}然后我改变了主意,是否可以从维护端保存,然后立即尝试。代码如下://维护端操作publicAddresssave(){Addressaddress=newAddress();address.setAddressName("北京海淀");用户user1=newUser();user1.setName("阿伟");地址.getUsers().add(user1);返回地址服务.保存(地址);结果,当我以为会成功的时候,发现只保存了Address表,并没有报错,就是User表和关联表死活没有数据。此时,问题又出现了。查阅了各种文档,大概是需要添加级联属性。转换内容如下:@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,mappedBy="addresses")privateSetusers=newHashSet<>();修改后,再次保存。两个实体类的表确实都产生了数据,但是关联的表还是少了。这个时候我快疯了,但是问题还是没有解决。继续耐心分析后,很快在控制台打印的sql中发现了一些猫腻:果然没有对关联表进行数据操作,摸索了一阵子,终于找到了根本原因。被维护端发起操作时,需要在相关属性上相互添加,感觉真的有那么点“爱”,羡慕别人!!!//维护操作publicAddresssave(){Addressaddress=newAddress();address.setAddressName("中央花园");用户user1=newUser();user1.setName("阿伟");用户1。设置高度(“170”);user1.setSex("1");//添加user1.getAddresses().add(address);地址.getUsers().add(user1);返回地址服务.save(地址);最终问题彻底解决,数据持久化到对应的表中。我真的松了一口气。虽然过程一波三折,但结果却让我很受鼓舞。希望本文能帮助大家避开jpa的坑。这是我最引以为豪的。每条路都是坑坑洼洼的,有时你可能会掉进坑里。希望大家能够重新站起来,跳过阻碍自己的“坑”,最终收获颇丰,让自己变得更强大。