同步操作将从 小牛肉/cs-wiki 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
当实体类与其映射的数据库表名不同名时需要使用 @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 字段映射到数据库列时,我们可以在实体类中通过注解来设置数据库表中的列定义 👇
@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;
}
......
@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;
}
......
}
默认情况下,JPA 使用字段名作为数据库表列名。我们可以使用 @Column
注释来更改默认值。
以下代码设置 Java Bean 中的 salary
字段对应数据库表中的列 sal
:
@Column(name = "sal")
private int salary;
例如,当将字符串字段映射到 VARCHAR
时,我们可以在 @Column
注释中设置 VARCHAR
长度:
@Column(length=40)
private String name;
当将 float
或 double
值映射到数据库表列时,我们可以设置数字类型列的精度和尺度。
以下代码将浮点值映射到具有精度 8 和尺度 2 的数据库表列:
@Column(precision=8, scale=2)
private float hourlyRate;
我们可以设置映射列是否可以具有空值或者列是否应该具有唯一值。
@Column(name="my_name", unique=true, nullable=false)
private String name;
上面的代码将 name 列设置为唯一且不能为空值。
如果我们不想将属性保存到数据库,可以使用 @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;
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。