需要再 pom 文件中添加以下依赖
|
|
接下来介绍 jpa 的关系映射
@Entity
标识这个实体类是一个 JPA 实体,告诉 JPA 在程序运行的时候记得生成这个实体类所对应的表~!
#@Table(name = “自定义的表名”)
自定义设置这个实体类在数据库所对应的表名!
#@Id
把这个类里面所在的变量设置为主键 Id。
#@GeneratedValue
设置主键的生成策略,这种方式依赖于具体的数据库,如果数据库不支持自增主键,那么这个类型是没法用的。
#@Basic
表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的 getXxxx()方法,默认 即为 @Basic fetch: 表示该属性的读取策略,有 EAGER 和 LAZY 两种,分别表示主支抓取和延迟加载,默认为 EAGER.
#@Column(name = “自定义字段名”,length = “自定义长度”,nullable = “是否可以空”,unique = “是否唯一”,columnDefinition = “自定义该字段的类型和长度”)
表示对这个变量所对应的字段名进行一些个性化的设置,例如字段的名字,字段的长度,是否为空和是否唯一等等设置。
#@Transient
表示该属性并非一个到数据库表的字段的映射,ORM 框架将忽略该属性. 如果一个属性并非数据库表的字段映射,就务必将其标示为 @Transient ,否则,ORM 框架默认其注解为 @Basic。
#@Temporal
当我们使用到 java.util 包中的时间日期类型,则需要@Temporal 注释来说明转化成 java.util 包中的类型。其中包含三种转化类型分别是: java.sql.Date 日期型,精确到年月日,例如“2008-08-08” java.sql.Time 时间型,精确到时分秒,例如“20:00:00” java.sql.Timestamp 时间戳,精确到纳秒,例如“2008-08-08 20:00:00.000000001”
#@Enumerated(“需要定义存入数据库的类型”)
使用@Enumerated 映射枚举字段,以 String 类型存入数据库。
#@Embedded 和@Embeddable
当一个实体类要在多个不同的实体类中进行使用,而本身又不需要独立生成一个数据库表,这就是需要使用@Embedded、@Embeddable 的时候了。当被引用的对象和主对象拥有相同的生命周期的时候才考虑使用@Embedded 和@Embeddable。
#@ElementCollection
集合映射,当实体类包含多个相同类型的变量的时候就可以使用@ElementCollection 来声明这个变量,而 JPA 会为此生成两个关联的表。例如一个人有家庭住址,也有单位地址;但是“地址”并不能失去人的存在而存在,所以是一个失去独立性的实体类;所以地址不能映射为一个实体,这时就需要映射为组件,及人的信息里边包含地址。是整体与部分的关系。但由于这个地址可能有多个。比如公司地址、出生地址、家庭地址等。
#@OneToOne
JPA 使用@OneToOne 来标注一对一的关系。
实体 People :用户。
实体 Address:家庭住址。
People 和 Address 是一对一的关系。
这里用两种方式描述 JPA 的一对一关系。
一种是通过外键的方式(一个实体通过外键关联到另一个实体的主键);
另外一种是通过一张关联表来保存两个实体一对一的关系。
@OneToMany 和 @ManyToOne
实体 Author:作者。
实体 Article:文章。
Author 和 Article 是一对多关系(双向)。那么在 JPA 中,如何表示一对多的双向关联呢?
JPA 使用@OneToMany 和@ManyToOne 来标识一对多的双向关联。一端(Author)使用@OneToMany,多端(Article)使用@ManyToOne。
在 JPA 规范中,一对多的双向关系由多端(Article)来维护。就是说多端(Article)为关系维护端,负责关系的增删改查。一端(Author)则为关系被维护端,不能维护关系。
一端(Author)使用@OneToMany 注释的 mappedBy=“author"属性表明 Author 是关系被维护端。
多端(Article)使用@ManyToOne 和@JoinColumn 来注释属性 author,@ManyToOne 表明 Article 是多端,@JoinColumn 设置在 article 表中的关联字段(外键)。
@ManyToMany
实体 User:用户。
实体 Authority:权限。
用户和权限是多对多的关系。一个用户可以有多个权限,一个权限也可以被很多用户拥有。
JPA 中使用@ManyToMany 来注解多对多的关系,由一个关联表来维护。这个关联表的表名默认是:主表名+下划线+从表名。(主表是指关系维护端对应的表,从表指关系被维护端对应的表)。这个关联表只有两个外键字段,分别指向主表 ID 和从表 ID。字段的名称默认为:主表名+下划线+主表中的主键列名,从表名+下划线+从表中的主键列名。
需要注意的:
1、多对多关系中一般不设置级联保存、级联删除、级联更新等操作。
2、可以随意指定一方为关系维护端,在这个例子中,我指定 User 为关系维护端,所以生成的关联表名称为: user_authority,关联表的字段为:user_id 和 authority_id。
3、多对多关系的绑定由关系维护端来完成,即由 User.setAuthorities(authorities) 来绑定多对多的关系。关系被维护端不能绑定关系,即 Game 不能绑定关系。
4、多对多关系的解除由关系维护端来完成,即由 Player.getGames().remove(game)来解除多对多的关系。关系被维护端不能解除关系,即 Game 不能解除关系。
5、如果 User 和 Authority 已经绑定了多对多的关系,那么不能直接删除 Authority,需要由 User 解除关系后,才能删除 Authority。但是可以直接删除 User,因为 User 是关系维护端,删除 User 时,会先解除 User 和 Authority 的关系,再删除 Authority。
来查看一下例子
对应的去查看 teacher 的多对多如何配置的:
application.yaml
|
|
查询老师操作
运行结果查询
具体代码请查看 github 代码库
https://github.com/huangxiaofeng10047/demo
另外为了支持 es 和 jpa 同时可以处理数据,对于 GeoPoint 注解的数据进行了,转换,设置为 string 才可以同时满足 es 和 mysql 的存储。
参考文档:
https://javatute.com/spring-boot/not-a-managed-type-entity-spring-boot/
https://blooddark.github.io/blog/java-spring-data-jpa/1.html#onetoone