相信大部分java小伙伴在日常开发过程中,在存储操作层都会选择更容易上手的jpa,各种封装,通过注解等方式,简化了大量的代码内容,同时提升了开发效率,但是(敲黑板,永远都躲不开的但是...)相应也将一些问题隐藏,需要更多的时间去理解、分析才能找到病根。
jpa简介
jpa全称(java persistence api),通常叫持久层api。它提供面向对象的编程模型,让使用者更容易理解与上手;底层也提供了通用接口,可以实现与其它框架快速集成。下面整理一些基础概念,不了解的可以参考下:
jpa是一种orm规范。hibernate是jpa的一个子集。spring data jpa,是jpa的代码实现 ,同时底层为hibernate技术实现。jpa实战-级联操作目前小编所开发项目的数据持久层大部分采用的是spring data jpa,经过长时间的使用验证,发现出了级联保存问题,即调用repository的save方法后,发现数据结果却是“丢三落四”,这就很让人脑袋疼,下面结合代码一起分析下
代码场景:用户与住址是多对多的关系,jpa中描述这种关系通常使用@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表和关联表死活没有数据。此时,问题已经复现,查阅各种文档说明,大概是需要添加级联属性,改造内容如下@manytomany(cascade = cascadetype.all,fetch = fetchtype.eager,mappedby = addresses)private set users = new hashset();修改之后再一次进行保存,两个实体类的表确实都生成了数据,但是关联表还是没有,这时已经快要抓狂,但问题还是没解决,继续耐心分析,很快就在控制台打印sql处发现了一些猫腻:
果然是没有对关联表的数据操作,接下来又是一顿探索,终于找到根源了,由被维护端发起操作的时候,需要为关联类属性添加彼此,感觉真是关联到“恩爱”的地步了,羡煞旁人啊!!!// 被维护端操作 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的坑,这就是小编最骄傲的事情。每一条道路上都是坑洼不平的,有些时候可能会掉入坑里,希望每个人都能重新站起来,跳过阻挡你的“坑”,最终会收获到很多,让自己变得更强。
探讨机器学习在物联网中的挑战和机遇
渣浆泵冲刷磨损原因及修复方法
维密天使学编程:这是属于未来的语言
卫星通信的常用频段的详细对比
良心国产SSD诞生!坚持只用原厂原封颗粒
JPA基础概念
为什么MOSFET栅极前要放一个100Ω电阻?
工信部下一步工作的开展将在农村地区逐步部署5G网络
安谋中国与中国半导体的故事
澳柯玛坚守为提升生活品质 开发出冰玲珑BD-156WG风冷立式冷柜
LED显示屏的三大关键技术
2021慕尼黑上海电子生产设备展预定如火如荼, 超80%展位已预订!
C连接器传输开发优化的电源适配器
让数字世界坚定运行 | 华为发布2024数据中心能源十大趋势
广汽传祺GA3S PHEV驱动控制系统概述
京东方OLED面板通过苹果认证 为iPhone 14供货
深圳反制无人机设备的功能有哪些?
超远距离传输,超低功耗,安信可LoRa全系列产品如何选购?
多传感器时空标定
核心网通过引入SCEF可以满足5G多样化业务的需求