1 Star 0 Fork 552

HenryHit / CS-Wiki

forked from 小牛肉 / cs-wiki 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
1-实体类映射到数据库表的基本注解.md 6.00 KB
一键复制 编辑 原始数据 按行查看 历史
小牛肉 提交于 2021-07-11 21:36 . 🥽 更新目录结构

🛒 JPA 实体类映射到数据库表的基本注解


1. @Table

当实体类与其映射的数据库表名不同名时需要使用 @Table 注解用于指明数据库表的表名,该注解与 @Entity 注解并列使用。

@Table 常用选项是 name,用于指明数据库的表名,若不指定则以实体类名称作为表名

💬 不指定 name

@Table // 不指定 name,则数据库表名为 customer
@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String email;
    private int age;
    ......
}

生成的数据库表 DDL:

CREATE TABLE `customer` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Email` varchar(255) DEFAULT NULL,
  `Name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

💬 指定 name

@Table(name="hello") // 对应数据库表 hello
@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String email;
    private int age;
    ......
}

生成的数据库表 DDL:

CREATE TABLE `hello` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Email` varchar(255) DEFAULT NULL,
  `Name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

💡 我个人习惯不管相不相同,都写上 @Table(name="xxx"),方便阅读~

当将 Java Bean 字段映射到数据库列时,我们可以在实体类中通过注解来设置数据库表中的列定义 👇

2. @Id

@Id 注解用于声明一个实体类的属性映射为数据库的主键列

@Entity
@Table(name="professor")
public class Professor {
  @Id
  private int id;
  private String name;
  private long wage;

  // Getter And Setter

上面的代码将来自 Professor 类的 id 字段作为数据库中的表 professor 中的主键列。

该注解也放在主键属性的 Getter 方法上

@Entity
@Table(name="professor")
public class Professor {
  private int id;
  private String name;
  private long wage;

  @Id
  public int getId() {
      return id;
  }
    
  ......

3. @GeneratedValue

@GeneratedValue 注解表示将 id 字段标记为自动生成的主键列。 数据库将在插入时自动为 id 字段生成一个值到表:

@Entity
@Table(name="professor")
public class Professor {
  @Id
  @GeneratedValue
  private int id;
  private String name;
  private long wage;

  // Getter And Setter

一般会为 @GeneratedValue 指定一个生成策略

  • IDENTITY:采用数据库 ID 自增长的方式来自增主键字段,Oracle 不支持这种方式;
  • AUTO: JPA 自动选择合适的策略,是默认选项;
  • SEQUENCE:通过序列产生主键,通过 @SequenceGenerator 注解指定序列名,MySql 不支持这种方式
  • TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
@Entity
@Table(name="professor")
public class Professor {
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private int id;
  private String name;
  private long wage;

  // Getter And Setter

上面的代码将来自 Professor 类的 id 字段作为数据库中的表 professor 中的主键列,并且 id 自增长。

同样的,该注解也可以放在主键属性的 Getter 方法上

@Entity
@Table(name="professor")
public class Professor {

  private int id;
  private String name;
  private long wage;
	
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  public int getId() {
      return id;
  }
  
  ......
}

但是不能某个注解在属性之上,某个注解在 Getter 之上,将抛出异常:

/**
* 错误示例
**/
@Entity
@Table(name="professor")
public class Professor {
    
  @Id
  private int id;
  private String name;
  private long wage;
	
  
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  public int getId() {
      return id;
  }
  
  ......
}

4. @Column

① 设置列名

默认情况下,JPA 使用字段名作为数据库表列名。我们可以使用 @Column 注释来更改默认值。

以下代码设置 Java Bean 中的 salary 字段对应数据库表中的列 sal

@Column(name = "sal")
private int salary;

② 设置列长度

例如,当将字符串字段映射到 VARCHAR 时,我们可以在 @Column 注释中设置 VARCHAR 长度:

@Column(length=40)
private String name;

③ 设置列精度范围

当将 floatdouble 值映射到数据库表列时,我们可以设置数字类型列的精度和尺度。

以下代码将浮点值映射到具有精度 8 和尺度 2 的数据库表列:

@Column(precision=8, scale=2) 
private float hourlyRate;

④ 设置列唯一 / 可空

我们可以设置映射列是否可以具有空值或者列是否应该具有唯一值。

@Column(name="my_name", unique=true, nullable=false) 
private String name;

上面的代码将 name 列设置为唯一且不能为空值。

5. @Transient

如果我们不想将属性保存到数据库,可以使用 @Transient 注释标记该字段

如果一个属性并非数据库表的字段映射,就务必将其标示为 @Transient

@Entity
@Table(name="professor")
public class Professor {
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private int id;
  private String name;
  private long salary;
  @Transient 
  private String convertedName;

📚 References

Java
1
https://gitee.com/wyjhit/CS-Wiki.git
git@gitee.com:wyjhit/CS-Wiki.git
wyjhit
CS-Wiki
CS-Wiki
master

搜索帮助