springboot集成jpa使用mysql

需要再 pom 文件中添加以下依赖

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

接下来介绍 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。

来查看一下例子

image-20230519165807581

对应的去查看 teacher 的多对多如何配置的:

image-20230519165858239

application.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
   datasource:
      one:
         type: com.zaxxer.hikari.HikariDataSource
         driver: com.mysql.cj.jdbc.Driver
         jdbc-url: jdbc:mysql://localhost:3306/one?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
         username: root
         password: 123456
   jpa:
      hibernate:
         ddl-auto: update
      show-sql: true
      database-platform: org.hibernate.dialect.MySQLDialect
      open-in-view: false

查询老师操作

image-20230519170044134

运行结果查询

image-20230519170102993

具体代码请查看 github 代码库

https://github.com/huangxiaofeng10047/demo

另外为了支持 es 和 jpa 同时可以处理数据,对于 GeoPoint 注解的数据进行了,转换,设置为 string 才可以同时满足 es 和 mysql 的存储。

image-20230519171534278

参考文档:

https://javatute.com/spring-boot/not-a-managed-type-entity-spring-boot/

https://blooddark.github.io/blog/java-spring-data-jpa/1.html#onetoone

Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up