0%

Table注解

当实体类与其映射的数据库表名不同名时需要使用@Table注解说明

@Table与@Entity并列使用,置于实体类声明语句之前,可用于单独语句行,也可与声明语句同行


name

用于指明数据库的表名,若不指定则以实体类名称作为表名
1
2
3
4
5
6
7
8
@Table
@Entity
public class Customer {
private Integer id;
private String name;
private String email;
private int age;
}
此时生成的数据库表DDL
1
2
3
4
5
6
7
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属性名称
1
2
3
4
5
6
7
8
@Table(name="CUSTOMERS")
@Entity
public class Customer {
private Integer id;
private String name;
private String email;
private int age;
}
此时生成的数据库表DDL
1
2
3
4
5
6
7
CREATE TABLE `customers` (
`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;

catalog属性:

catalog和schema用于设置表所属的数据库目录或模式,通常为数据库名

catalog属性用于指定数据库实例名,一般来说persistence.xml文件中必须指定数据库url,url中将包含数据库实例

1
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa" />

当catalog属性不指定时,新创建的表将出现在url指定的数据库实例中
当catalog属性设置名称时,若数据库存在和指定名称一致的实例,新创建的表将出现在该实例中,

1
2
3
4
5
6
7
8
@Table(name="CUSTOMERS",catalog="hibernate")
@Entity
public class Customer {
private Integer id;
private String name;
private String email;
private int age;
}

在数据库hibernate实例中将创建一张名叫customers的新表
若数据库不存在和指定名称一致的实例,则创建表失败,提示错误
ERROR: HHH000388: Unsuccessful: create table hiber.CUSTOMERS (ID integer not null auto_increment, Age integer, Email varchar(255), Name varchar(255), primary key (ID))
所以该属性一般不需要设置


uniqueConstraints用于设置约束条件,通常不需要设置
1
2
3
4
5
6
7
8
@Table(name="CUSTOMERS",uniqueConstraints={@UniqueConstraint(columnNames={"name"})})
@Entity
public class Customer {
private Integer id;
private String name;
private String email;
private int age;
}
数据库DDL
1
2
3
4
5
6
7
8
CREATE TABLE `customers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`age` int(11) NOT NULL,
`email` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UK_kt165w8o83hunljcal4ufcmk9` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

uniqueConstraints={@UniqueConstraint(columnNames={“name”})} 表示name列的值不能重复

约束也可以是多列约束

1
2
3
4
5
6
7
8
@Table(name="CUSTOMERS",uniqueConstraints={@UniqueConstraint(columnNames={"name","email"})})
@Entity
public class Customer {
private Integer id;
private String name;
private String email;
private int age;
}

uniqueConstraints={@UniqueConstraint(columnNames={“name”,”email”}) 的意思是customer表中不同同时存在name+email的相同记录

数据库DDL

1
2
3
4
5
6
7
8
CREATE TABLE `customers` (
`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`),
UNIQUE KEY `UK_a4gmx9uvdyb7q19sf3seob2l8` (`Name`,`Email`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

uniqueConstraints是一个数组,可以指定多组约束:

1
uniqueConstraints={@UniqueConstraint(columnNames={"name","email"}),@UniqueConstraint(columnNames={"name","age"})} 

数据库DDL

1
2
3
4
5
6
7
8
9
CREATE TABLE `customers` (
`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`),
UNIQUE KEY `UK_a4gmx9uvdyb7q19sf3seob2l8` (`Name`,`Email`),
UNIQUE KEY `UK_ag4xexpudoihe3uvpsl9yvhsg` (`Name`,`Age`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;