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;
    }



相关文章
|
11天前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
12天前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
133 2
|
1月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
739 1
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
298 0
|
1月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
|
12天前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
336 2
|
12天前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
131 3
|
3月前
|
缓存 JSON 前端开发
第07课:Spring Boot集成Thymeleaf模板引擎
第07课:Spring Boot集成Thymeleaf模板引擎
431 0
第07课:Spring Boot集成Thymeleaf模板引擎
|
3月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
784 0
|
4月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
487 0

热门文章

最新文章