Spring Boot 学习研究笔记(九) - Spring Data JPA常用注解(1)

简介: Spring Boot 学习研究笔记(九) - Spring Data JPA常用注解

Spring Data JPA 常用注解详细说明

 

1、@Entity

Entity 说明这个class 是实体类,并且使用默认的orm 规则,即 class 名对应数据库表中的表明,class 字段名即表中的字段名。


如果想要改变这种默认的orm 规则,就要使用 @Table 来改变 class 名与数据库中表名的映射规则,@Column 来改变class 中字段与 db 中表的字段名的映射规则。

 

元数据属性说明:

name:表名

下面的示例说明,Custommer 类对应数据库中的 Custommer 表,其中name 为可选,缺省类名即表名!

   @Entity(name=”Customer”)

   public class Customer { ... }


2、@Table

Table 用来定义 entity 主表的name 、catalog 、schema 等属性。

元数据属性说明:

name : 表名

catalog:对应关系数据库中的 catalog

schema:对应关系数据库中的 schema

UniqueConstraints:定义一个UniqueConstraint 数组,指定需要建唯一的约束的列。

schema与catalog的理解

sql环境中Catalog和Schema都属于抽象概念,主要用来解决命名冲突问题。一个数据库系统包含多个Catalog,每个Catalog包含多个Schema,每个Schema包含多个数据库对象(表、视图、字段等)。

数据库的完全限定名称可以为 Catalog名称.Schema名称.表名称。

 

UniqueConstraint的理解

定义在Table或SecondaryTable元数据里,用来指定建表时需要建唯一约束的列。

元数据属性说明: columnNames:定义一个字符串数组,指定要建唯一约束的列名。

 

联合约束:

@Entity

@Table(name="tbl_sky",

 uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})})


单一字段约束:

@Entity

@Table(name="tbl_sky",

 uniqueConstraints = {@UniqueConstraint(columnNames="month")})

 

3、@Id

@Id 标注用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。@Id标注也可置于属性的getter方法之前。


元数据属性说明:

• generate():主键值的获取类型

• generator():TableGenerator的名字(当generate=GeneratorType.TABLE才需要指定该属性)

@Table(name="CUSTOMERS")
@Entity
public class Customer {
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Id
    private Integer id

4、@GeneratedValue

@GeneratedValue 用于标注主键的生成策略,通过strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略。

GeneratedValue推荐两种写法:

第一种,写在属性之上:

@Table(name="CUSTOMERS")
@Entity
public class Customer {
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Id
    private Integer id;
    private String name;
    private String email;
    private int age;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

第二种,写在getter方法之上:

@Table(name="CUSTOMERS")
@Entity
public class Customer {
    private Integer id;
    private String name;
    private String email;
    private int age;
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Id
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

GenerationType :

JPA提供的四种标准用法为 TABLE,SEQUENCE,IDENTITY,AUTO。

  • TABLE:使用一个特定的数据库表格来保存主键。
  • SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
  • IDENTITY:主键由数据库自动生成(主要是自动增长型)
  • AUTO:主键由程序控制。

(1)、TABLE:

@Id  
@GeneratedValue(strategy = GenerationType.TABLE, generator="payablemoney_gen")  
@TableGenerator(name = "pk_gen",  
    table="tb_generator",  
    pkColumnName="gen_name",  
    valueColumnName="gen_value",  
    pkColumnValue="PAYABLEMOENY_PK",  
    allocationSize=1  
)

在主键生成后,这条记录的value值,按allocationSize递增。

@TableGenerator 定义如下:

@Target({TYPE, METHOD, FIELD})   
@Retention(RUNTIME)  
public @interface TableGenerator {  
  String name();  
  String table() default "";  
  String catalog() default "";  
  String schema() default "";  
  String pkColumnName() default "";  
  String valueColumnName() default "";  
  String pkColumnValue() default "";  
  int initialValue() default 0;  
  int allocationSize() default 50;  
  UniqueConstraint[] uniqueConstraints() default {};  
}

@TableGenerator属性说明如下:

  • name :属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值。
  • table: 属性表示表生成策略所持久化的表名,例如,这里表使用的是数据库中的“tb_generator”。
  • catalog 属性和 schema属性具体指定表所在的目录名或是数据库模式名。
  • pkColumnName: 属性的值表示在持久化表中,该主键生成策略所对应键值的名称。例如在“tb_generator”中将“gen_name”作为主键的键值。
  • valueColumnName: 属性的值表示在持久化表中,该主键当前所生成的值,它的值将会随着每次创建累加。例如,在“tb_generator”中将“gen_value”作为主键的值。
  • pkColumnValue: 属性的值表示在持久化表中,该生成策略所对应的主键。例如在“tb_generator”表中,将“gen_name”的值为“CUSTOMER_PK”。
  • initialValue: 表示主键初始值,默认为0。
  • allocationSize: 表示每次主键值增加的大小。例如设置成1,则表示每次创建新记录后自动加1,默认为50。
  • UniqueConstraint: 与@Table标记中的用法类似。

 

(2)、SEQUENCE

@Id  
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator="payablemoney_seq")  
@SequenceGenerator(name="payablemoney_seq", sequenceName="seq_payment")  
@SequenceGenerator定义如下:
@Target({TYPE, METHOD, FIELD})   
@Retention(RUNTIME)  
public @interface SequenceGenerator {  
 String name();  
 String sequenceName() default "";  
 int initialValue() default 0;  
 int allocationSize() default 50;  
}

以上属性说明如下:

  • name: 属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。
  • sequenceName: 属性表示生成策略用到的数据库序列名称。
  • initialValue: 表示主键初识值,默认为0。
  • allocationSize: 表示每次主键值增加的大小。例如设置成1,则表示每次创建新记录后自动加1,默认为50。

(3)、IDENTITY

@Id  

@GeneratedValue(strategy = GenerationType.IDENTITY)  

(4)、AUTO

@Id  

@GeneratedValue(strategy = GenerationType.AUTO)

在指定主键时,如果不指定主键生成策略,默认为AUTO。

 

5、@Basic

@Basic 是实体类与数据库字段映射时最简单的类型。它可以用于持久类属性或实例变量(instance variable)上,类型包含java基本类型(byte,short,int,long,float,double,char,boolean),包装类,枚举类,以及实现了Serializable接口的类型。

@basic注解有两个属性:

FetchType fetch() default EAGER;

boolean optional() default true;


fetch用来指定属性的加载机制

有两个选项:EAGER(即时加载,默认值)和LAZY(懒加载),即时加载意味着当实例化对象的时候必须加载该属性值,懒加载是指当实例化对象时不加载该属性,只有当调用该属性时才加载.


optional用来指定属性是否可空

有两个选项:true(可空,默认值)和false

如果你在实体类属性上不加@Basic注解,它也会自动加上@Basic,并使用默认值。

 

6、@Column

Column元数据定义了映射到数据库的列的所有属性:列名,是否唯一,是否允许为空,是否允许更新等。

元数据属性说明: • name:列名。 • unique: 是否唯一 • nullable: 是否允许为空 • insertable: 是否允许插入 • updatable: 是否允许更新 • columnDefinition: 定义建表时创建此列的DDL

• secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。

public class Person {
 @Column(name = "PERSONNAME", unique = true, nullable = false, updatable = true)
 private String name;
 @Column(name = "PHOTO", columnDefinition = "BLOB NOT NULL", secondaryTable="PER_PHOTO")
 private byte[] picture;


columnDefinition可以指定创建表时一些SQL语句,比如这里可以一次性指定,varchar长度128,且不能为空 . 当然,相同的结果可以通过nullable和length属性结合实现。

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name = "Name")
    private String name;
    @Column(name = "Email", nullable = true, length = 128)
    private String email;
    @Column(name = "Age")
    private int age;
    ......
}

columnDefinition属性的特殊使用: 编程语言中字符串一般都用String表示,但是数据库中varcahr数值类型有长度限制,一旦需要大文本,则需要text数值类型 但是String类型默认映射的数值类型是varchar,columnDefinition可以进行额外指定。

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;
    @Column(name = "Name")
    private String name;
    @Column(name = "Email", nullable = true, length = 128)
    private String email;
    @Column(name = "Age")
    private int age;
    @Column(name = "Remark",columnDefinition="text")
    private String remark;
    ......
}

7、@IdClass

当entity class 使用复合主键时,需要定义一个类作为id class。

id class 必须符合以下要求:

类必须声明为public , 并提供一个声明为public 的空构造函数。

必须实现Serializable 接口,覆写 equals() 和 hashCode()方法。

entity class的所有id field在id class都要定义,且类型一样。

元数据属性说明:

value: id class的类名

public class EmployeePK implements java.io.Serializable{
       String empName;
       Integer empAge;
    public EmployeePK(){}
    public boolean equals(Object obj){ ......}
    public int hashCode(){......}
    }
    @IdClass(value=com.acme.EmployeePK.class)
    @Entity(access=FIELD)
    public class Employee {
        @Id String empName;
        @Id Integer empAge;
    }



相关文章
|
2月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
73 9
|
3月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
46 9
|
2月前
|
Java Kotlin 索引
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
36 0
|
3月前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
30 1
|
3月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
119 2
|
3月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
305 1
|
3月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
141 0
|
Java API Spring
Spring学习路径
Spring作为一个优秀的开源企业级框架有着一下特点 开源框架 简化企业级应用开发的流程 Spring是一个JavaSE/EE的一站式框架 优点在于 方便解耦 AOP的编程支持 声明式事务的支持 可以引入jUnit4,方便程序测试 对优秀开源框架的支持,方便集成 降低JavaEE API的使用难度.
2520 0
|
3月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
261 2
|
13天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)

热门文章

最新文章