0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

JPA基础概念

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-08 14:36 次阅读

相信大部分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< Address > addresses = new HashSet<  >();
}
//被维护方
public class Address{
    //属性代码省略
    @ManyToMany(mappedBy = "addresses")
    @JsonIgnore
    private Set< User > 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< User > 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的坑,这就是小编最骄傲的事情。每一条道路上都是坑洼不平的,有些时候可能会掉入坑里,希望每个人都能重新站起来,跳过阻挡你的“坑”,最终会收获到很多,让自己变得更强。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7015

    浏览量

    88996
  • 存储
    +关注

    关注

    13

    文章

    4308

    浏览量

    85832
  • API
    API
    +关注

    关注

    2

    文章

    1499

    浏览量

    61989
  • 编程
    +关注

    关注

    88

    文章

    3615

    浏览量

    93710
收藏 人收藏

    评论

    相关推荐

    JPA实体类中的注解介绍

    今天给大家介绍一下 JPA 实体类中的注解,希望能对大家有帮助。 基本注解 @Entity 标注于实体类声明语句之前,指出该 Java 类为实体类,将映射到指定的数据库表。 name(可选):实体
    的头像 发表于 09-25 14:42 709次阅读

    VHDL的基础概念

    VHDL的基础概念
    发表于 08-20 20:41

    Labview的概念

    基本概念
    发表于 06-30 12:45

    JPA分页查询的常用方法

    JPA分页查询与条件分页查询
    发表于 10-23 17:10

    使用jpa和thymeleaf做增删改查示例

    【本人秃顶程序员】springboot专辑:springboot+jpa+thymeleaf增删改查示例
    发表于 04-01 11:49

    springboot spring data jpa使用总结

    【本人秃顶程序员】springboot专辑:spring data jpa的使用
    发表于 04-15 11:38

    怎么学习SpringBoot

    SpringBoot学习之路(X5)- 整合JPA
    发表于 06-10 14:52

    ARM的概念

    本文简单梳理一下ARM有关的概念,包括ARM architecture、ARM core、ARM CPU(或MCU)以及ARM Soc。我们这些以ARM平台为主的嵌入式工程师,几乎每天都会和这些概念
    发表于 03-03 06:36

    PWM的概念和产生原理

    文章目录前言一、PWM的概念和产生原理1. PWM的概念2. PWM产生原理二、PWM工程1. 新建工程2. 设置PWM3. 代码介绍4. 代码编写5. 实验现象6. 代码修改17. 代码修改28.
    发表于 08-09 08:26

    嵌入式数据库驱动程序类相关资料分享

    creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': ...
    发表于 12-21 07:45

    怎样去设计一个基于springboot+freemark+jpa+MySQL的在线电影订票系统

    本系统是由springboot+freemark+jpa+MySQL实现的在线电影订票系统,主要的亮点功能有:支持短信发送接口、支付宝在线支付接口、座位锁定及并发处理、排片时间冲突检测等。本系统主要
    发表于 01-03 07:22

    为什么会出现中断的概念呢?这个概念是为了解决什么问题

    本篇博客不是针对某一门具体的技术,而是从概念去理解某些东西,当然会拿某些技术举例子但是不限于特定某一门。中断的概念:中断的概念最开始接触是在stm32单片机中。为什么会出现中断的概念
    发表于 01-05 08:02

    一文详谈Spring JPA

    大家好,今天我和大家聊一下关于Spring JPA 的相关知识,我们先来了解下什么是 JPA
    的头像 发表于 06-30 17:29 2217次阅读

    基于概念可辨识矩阵的概念约简方法

    基于布尔因子分析的概念约简能够保持形式背景的二元关系不变。借鉴概念格中基于可辨识矩阵求解属性约简的思想,在形式背景上定义概念可辨识矩阵,基于此给岀保持二元关系不变的概念约简方法。首先,
    发表于 04-19 15:39 1次下载
    基于<b class='flag-5'>概念</b>可辨识矩阵的<b class='flag-5'>概念</b>约简方法

    使用JPA访问数据的过程

    本指南将引导您完成构建应用程序的过程,该应用程序使用#spring# #spring认证# Spring Data JPA 在关系数据库中存储和检索数据。
    的头像 发表于 09-06 15:48 640次阅读