我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringDataJPA实体类关系映射配置方式有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringDataJPA实体类关系映射配置方式有哪些

这篇文章将为大家详细讲解有关SpringDataJPA实体类关系映射配置方式有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

SpringDataJPA

//FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载//FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载//cascade = CascadeType.ALL 表示所有情况下均进行关联操作,即save-update和delete@JsonBackReference   //解决循环引用问题@JsonIgnoreProperties(value = "order") //解决循环引用问题,order内容大,不加载//双向映射存在转json无限递归问题 需要注解来处理 推荐使用第二个注解 value值为对方表作映射的变量值

1.单向一对一映射

一方

  //教师  @Id @GeneratedValue(strategy=GenerationType.IDENTITY)  private int id;  private String name;  private long salary;  @OneToOne   @JoinColumn(name="PSPACE_ID")   private ParkingSpace parkingSpace;

一方

//停车场    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)    private int id;    private int lot;    private String location;

总结

添加时候需要先添加@OneToOne的那方,删除也是。

2.双向一对一映射

一方

  //人员  @Id  @GeneratedValue(strategy=GenerationType.IDENTITY)  private long id;  private String name;  @OneToOne  @JoinColumn(name="DEPT_ID")  @JsonIgnoreProperties(value = "person")  private Department department;

一方

  //部门  @Id  @GeneratedValue(strategy=GenerationType.IDENTITY)  private long id;  private String name;  @OneToOne(mappedBy="department")  @JsonIgnoreProperties(value = "department")  private Person person;

总结

@JsonBackReference   //解决循环引用问题@JsonIgnoreProperties(value = "order") //解决循环引用问题,order内容大,不加载//双向映射存在转json无限递归问题 需要注解来处理 推荐使用第二个注解 value值为对方表作映射的变量值

3.单向一对多映射

一方

@Id    @GeneratedValue    private Long id;    @Column(length = 32)    private String name;    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)//级联保存、更新、删除、刷新;延迟加载    @JoinColumn(name = "author_id")//在book表增加一个外键列来实现一对多的单向关联    private Set<Book> books = new HashSet<Book>();

多方

//单向一对多的情况下  多方不需要加任何关联标识 @Id    @GeneratedValue    private Long id;    @Column(length=32)    private String name;

总结

因为是单向的关联,多方不需要加任何的关联标识 只需要在一方添加即可

4.双向一对多映射

一方

@Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer id; //主键    private String name; //姓名    //描述客户可以有多个订单    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)    @JsonBackReference    private Set<Order> order = new HashSet<Order>();

多方

@Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer id;    private Double money;    private String receiverInfo; //收货地址    // 订单与客户关联    @ManyToOne(cascade = CascadeType.ALL)    @JoinColumn(name = "c_id") //指定外键列      @JsonIgnoreProperties(value = "order") //解决循环引用问题,order内容大,不加载    private Customer customer; //描述订单属于某一个客户

总结

@JsonBackReference   //解决循环引用问题@JsonIgnoreProperties(value = "order") //解决循环引用问题,order内容大,不加载//双向映射存在转json无限递归问题 需要注解来处理 推荐使用第二个注解 value值为对方表作映射的变量值

5.单向多对一映射

多方

 @GeneratedValue @Id private Integer id; @Column(name="ORDER_NAME") private String orderName; //映射单向 n-1的关联关系 //使用@ManyToOne来映射多对一的关联关系 //使用@JoinColumn 来映射外键 //可使用 @ManyToOne 的fetch 属性来修改默认的关联属性的加载策略 @JoinColumn(name="CUSTOMER_ID")  //此外键为一方的主键 @ManyToOne(fetch=FetchType.EAGER) private Customer customer;

一方

//单向多对一的情况下,一方不需要加任何关联标识    @GeneratedValue(strategy=GenerationType.AUTO)    @Id    private Integer id;    private String lastName;    private String email;    private int age;    private Date createdTime;    private Date birth;

总结

保存多对一时,建议先保存1的一端,后保存n的一端,这样不会多出额外的update语句。

6.双向多对一映射

多方

 @GeneratedValue @Id private Integer id; @Column(name="ORDER_NAME") private String orderName; //映射单向 n-1的关联关系 //使用@ManyToOne来映射多对一的关联关系 //使用@JoinColumn 来映射外键 //可使用 @ManyToOne 的fetch 属性来修改默认的关联属性的加载策略 @JoinColumn(name="CUSTOMER_ID") @ManyToOne(fetch=FetchType.EAGER) @JsonIgnoreProperties(value = {"customer","orders"}) private Customer customer;

一方

@GeneratedValue(strategy=GenerationType.AUTO)    @Id    private Integer id;    @Column(name="LAST_NAME",length=50,nullable=false)    private String lastName;    private String email;    private int age;    //定义日期格式    @Temporal(TemporalType.TIMESTAMP)    private Date createdTime;    @Temporal(TemporalType.DATE)    private Date birth;    //映射单向1-n的关联关系    //使用@OneToMany 映射单向1-n的关联关系    //使用@JoinColumn 来映射外键的名称    //可以使用@OneToMany 的 fetch 属性来修改加载策略    //可以使用@OneToMany 的 cascade 属性来修改默认的删除策略//    @JoinColumn(name="CUSTOMER_ID")    //一的一端放弃维持关联关系    @OneToMany(fetch=FetchType.EAGER,cascade={CascadeType.REMOVE},mappedBy="customer")    @JsonIgnoreProperties(value = "orders")    private Set<Order> orders = new HashSet<>();

总结

必须使用@JsonIgnoreProperties注解来拦截转json时无限递归的问题

若是双向 1-n 的关联关系, 执行保存时:

(1)若先保存 n 的一端, 再保存 1 的一端, 默认情况下, 会多出2n 条 UPDATE 语句;

(2)若先保存 1 的一端, 则会多出 n 条 UPDATE 语句。

(3)故在进行双向 1-n 关联关系时, 建议使用 n 的一方来维护关联关系, 而 1 的一方不维护关联系, 这样会有效的减少 SQL 语句(即,N的一端对应的表中使用外键关联1的一端,外键对应1的一端的表主键)

注意:若在 1 的一端的 @OneToMany 中使用 mappedBy 属性, 则 @OneToMany 端就不能再使用 @JoinColumn 属性了。

7.单向多对多映射

多方

   @Id    @GeneratedValue    private Long id;    private String name;    // 表示多对多    @ManyToMany(cascade = CascadeType.ALL)    // 中间表的表名    @JoinTable(name = "t_user_role", joinColumns = {@JoinColumn(name = "user_id")},            //反转  user这个表的 反面则是 role            inverseJoinColumns = {@JoinColumn(name = "role_id")})    private Set<Role> roles = new HashSet<>();

多方

@Id    @GeneratedValue    private Long id;    private String name;

总结

使用 @JoinTable 来映射中间表

name 指向中间表的名字

joinColumns 映射当前类所在的表在中间表中的外键

1 name 指定外键列的列名

2 referencedColumnName 指定外键列关联当前表的哪一列

inverseJoinColumns 映射关联的类所在中间表的外键

8.双向多对多映射

多方

@Id    @GeneratedValue    private Long id;    private String name;    // 表示多对多    @ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)    @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="user_id")},            inverseJoinColumns ={@JoinColumn(name="role_id")} )    @JsonIgnoreProperties(value = "users")    private Set<Role> roles = new HashSet<>()

多方

@Id    @GeneratedValue    private Long id;    private String name;    @ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)    @JoinTable(name="t_user_role",joinColumns={@JoinColumn(name="role_id")},            inverseJoinColumns ={@JoinColumn(name="user_id")} )    @JsonIgnoreProperties(value = "roles")    private Set<User> users = new HashSet<>();

总结

使用 @JoinTable 来映射中间表

name 指向中间表的名字

joinColumns 映射当前类所在的表在中间表中的外键

1 name 指定外键列的列名

2 referencedColumnName 指定外键列关联当前表的哪一列

inverseJoinColumns 映射关联的类所在中间表的外键

@JsonBackReference //解决循环引用问题@JsonIgnoreProperties(value = "order") //解决循环引用问题,order内容大,不加载

双向映射存在转json无限递归问题 需要注解来处理 推荐使用第二个注解 value值为对方表作映射的变量值

关于“SpringDataJPA实体类关系映射配置方式有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringDataJPA实体类关系映射配置方式有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringDataJPA实体类关系映射配置方式有哪些

这篇文章将为大家详细讲解有关SpringDataJPA实体类关系映射配置方式有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。SpringDataJPA//FetchType.LAZY:懒加载,加载一个
2023-06-21

JPA配置方式+逆向工程映射到Entity实体类的示例分析

这篇文章主要为大家展示了“JPA配置方式+逆向工程映射到Entity实体类的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JPA配置方式+逆向工程映射到Entity实体类的示例分析”这篇
2023-06-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录