问题描述

在利用Spring boot data JPA进行表设计的时候,表对象之间经常存在各种映射关系,如何正确将理解的映射关系转化为代码中的映射关系是关键之处。

解决办法

概念理解

  • 举例:在公司的权限管理中,存在公司表、部门表、员工表。

    1. 公司表和部门表的关系:

      主控方:部门表

      被控方:公司表
    2. 部门表和员工表的关系:

      由于是多对多的关系,不存在谁是主控方或被控方,两者处于平行关系。
  • 一对多或多对一,用外键关联,若未设置级联删除,则删除被控方记录的时候会有外键约束。

  • 多对多,用中间表关联,删除中间表的记录,不会各方的表造成影响。
  • 在该四个注解中,都含有属性可设置,以下举例两个属性。
    1. fetch=FetchType.LAZY为默认的数据延迟加载,fetch=FetchType.EAGER为急加载。
    2. cascade={CascadeType.PERSIST,CascadeType.MERGE,

      CascadeType.REFRESH,CascadeType.REMOVE}.

      其中:

      CascadeType.PERSIST级联新增(又称级联保存);

      CascadeType.MERGE:级联合并(级联更新);

      CascadeType.REMOVE:级联删除;

      CascadeType.REFRESH:级联刷新

      CascadeType.ALL:以上四种都是;

      一般采用CascadeType.MERGE:级联合并(级联更新)即可。默认值是均不进行关联。

@OneToOne

  • 在一对一的关系中,只需在主控方(数据总表)内注明@OneToOne,而被控方(员工表)只是作为外键,不需任何特殊标记。
@Entity
@Table(name = "costume_all_id")
public class AllId extends AbstractEntity {
private static final long serialVersionUID = 1L; @OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "costume_member_fk")
private Member member;// 用户表外键
}

@OneToMany和@ManyToOne

  • 公司(组织)表相对于部门表是被控方,只需在被控方写mappedBy,其值为主控方中引用的外键对象的名称。
@Entity
@Table(name = "costume_organization")
public class Organization extends AbstractEntity {
private static final long serialVersionUID = 1L; @Column(nullable = false, length = 50)
private String name; // 组织名称 @OneToMany(mappedBy = "organization")
private Set<Department> departmentSet; // 部门集合
}
  • 部门表相对于公司(组织)表是主控方,在主控方只需写@ManyToOne即可,其对象名为被控表中mappedBy中的值。
  • 同时需要注意,如果需要将公司表对象或者部门表对象转为JSON数据的时候,为了防止出现无限循环包含对方,需要在部门表(多的一方)的引用公司表(少的一方)对象的set方法上写上注解@JsonBackReference
@Entity
@Table(name = "costume_department")
public class Department extends AbstractEntity {
private static final long serialVersionUID = 1L; @Column(nullable = false, length = 50)
private String name; // 部门名称 @ManyToOne(optional = false)
private Organization organization; // 组织外键 @ManyToMany
private Set<Member> memberSet; // 用户表外键 public Organization getOrganization() {
return organization;
} @JsonBackReference
public void setOrganization(Organization organization) {
this.organization = organization;
}
}

@ManyToMany

  • 在多对多的情况下,如部门表和员工表之间的关系(暂不去深究一个员工是否能有多个部门的身份)。
  • 部门表和员工表只需在引用对象集合上注明@ManyToMany即可,其中部门表的写法如上段代码,员工表的写法如下段代码。
  • 在多对多的映射中会生成一张中间表,其表名和字段名均有默认的命名规则,若需指定表名和字段名,只需在两者的一方或双方写上@JoinTable注解即可,详情如下代码段,表名属性name=”table_name”,与joinColumns属性是同级属性,即写在其前即可。
  • 同时需要注意,如果需要将员工表对象或者部门表对象转为JSON数据的时候,为了防止出现无限循环包含对方,需要在一方的引用对方对象的set方法(Set对象的set方法)上写上注解@JsonBackReference
@Entity
@Table(name = "costume_member")
public class Member extends AbstractEntity {
private static final long serialVersionUID = 1L; @Column(nullable = false, length = 20)
private String name; @ManyToMany
@JoinTable(joinColumns = { @JoinColumn(name = "member_id") }, inverseJoinColumns = {
@JoinColumn(name = "department_id") }) //被控方表字段名
private Set<Department> departmentSet; // 部门表外键 public Set<Department> getDepartmentSet() {
return departmentSet;
} @JsonBackReference
public void setDepartmentSet(Set<Department> departmentSet)
{
this.departmentSet = departmentSet;
}
}

Spring boot data JPA数据库映射关系 : @OneToOne,@OneToMany,@ManyToMany的更多相关文章

  1. MyGeneration模板生成NHibernate映射文件和关系(one-to-one,one-to-many,many-to-many)

    MyGeneration的几个NHibernate模板功能已经很强,但还是存在些问题.例如:Guid主键支持不佳,代码不易修改,不支持中文注释等等.所以我决定自己来改写此模版.我把一部分通用的函数提取 ...

  2. spring boot - 整合jpa多对对关系保存和查询示例

    pojo: package com.example.zs.springDataJpa; import org.hibernate.annotations.Proxy; import javax.per ...

  3. Spring boot data jpa 示例

    一.maven pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns ...

  4. spring boot xml与dao 映射关系

    mybatis的xml路径要和 dao的路径一模一样 dao 用@Mapper 注解

  5. Spring------Spring boot data jpa的使用方法

    1.DoMain.java import org.springframework.boot.SpringApplication; import org.springframework.boot.aut ...

  6. Spring boot通过JPA访问MySQL数据库

    本文展示如何通过JPA访问MySQL数据库. JPA全称Java Persistence API,即Java持久化API,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据 ...

  7. Spring Boot(二):数据库操作

    本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是JdbcTemplate,第二种是JPA,第三种是Mybatis.之前已经提到过,本系列会以一个博客系统 ...

  8. 【Spring Boot&&Spring Cloud系列】Spring Boot中使用数据库之MySql

    对于传统关系型数据库来说,Spring Boot使用JPA(Java Persistence API)资源库提供持久化的标准规范,即将Java的普通对象通过对象关系映射(ORM)持久化到数据库中. 项 ...

  9. Spring Boot2 系列教程(二十四)Spring Boot 整合 Jpa

    Spring Boot 中的数据持久化方案前面给大伙介绍了两种了,一个是 JdbcTemplate,还有一个 MyBatis,JdbcTemplate 配置简单,使用也简单,但是功能也非常有限,MyB ...

随机推荐

  1. [BUG]Dreamweaver6做网页的一个图片文字不清晰的问题

    自己用Dreamweaver6做一个网页,使用PS做图片,为了节约下载流量,我把图片裁剪为GIF格式,通过系统自带的图片浏览器和美图看看,图片上的文字都是清晰的. 我把图片加载进入DW中后,在DW界面 ...

  2. 【图片匹配】--- SIFT_Opencv3.1.0_C++_ubuntu

    最近在捣鼓图片相似性匹配算法.这里先说一点必要的题外话: 如果是在同一个object不同角度拍摄的多张图片中,使用SIFT可以有不错的效果: 如果是寻找类别相同的图片(可能不是同一object),SI ...

  3. [转]Using the Repository Pattern with ASP.NET MVC and Entity Framework

    本文转自:http://www.codeguru.com/csharp/.net/net_asp/mvc/using-the-repository-pattern-with-asp.net-mvc-a ...

  4. 移动web开发填坑(一)

    上周开始接触移动web开发,默默的掉进了很多坑里面.本文主要总结本周遇到的坑以及如何填坑. 1.px与rem换算. 设计稿的宽度一般是640px,而iphone是320px,所以测量设计稿的结果首先要 ...

  5. 阿里云服务器 Access to the path '....' is denied.解决方法

    昨天公司项目迁移服务器,从自己服务器迁移到阿里云服务器,部署完成后发现有一个页面要读取磁盘上的静态文件就报错了... 如图: 解决办法: 在 Web.Config 的 <System.Web&g ...

  6. Spring数据访问2 - 通过JDBC访问数据库

    因为原生的jdbc操作太复杂,几乎都是建立连接.关闭连接和处理例外等模板式的代码,Spring对此进行了抽象——使用模板来消除样板式代码 ,JdbcTemplate承担了简化数据库访问这块的任务. 利 ...

  7. Delphi win10 asssertion failure

    Delphi2007 原来安装在Win7 下 运行正常, 自从升级到Win10 ,新建工程运行然后关闭报错, 报错信息如下: ---------------------------bds.exe - ...

  8. cron on Centos

    1. crond.service 2. configuration 2.0 format # Example of job definition: # .---------------- minute ...

  9. clusterdb - 对一个PostgreSQL数据库进行建簇

    SYNOPSIS clusterdb [ connection-option...] [ --table | -t table] [ dbname] clusterdb [ connection-op ...

  10. 基于oauth2.0实现应用的第三方登录

    OAuth2 OAuth2所涉及到的对象主要有以下四个: Client 第三方应用,我们的应用就是一个Client Resource Owner 资源所有者,即用户 Authorization Ser ...