@Table:
當實體類與其映射的數據庫表名不同名時需要使用 @Table 標注說明,該標注與 @Entity 標注並列使用,置於實體類聲明語句之前,可寫於單獨語句行,也可與聲明語句同行。
@Table 標注的常用選項是 name,用於指明數據庫的表名
@Table標注還有一個兩個選項 catalog 和 schema 用於設置表所屬的數據庫目錄或模式,通常為數據庫名。uniqueConstraints選項用於設置約束條件,通常不須設置。
name屬性:
name屬性用於指定數據庫表名稱
若不指定則以實體類名稱作為表名
@Table @Entity public class Customer { 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="CUSTOMERS") @Entity public class Customer { private Integer id; private String name; private String email; private int age; ...... }
則生成的數據庫表DDL:
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;
從上述兩個例子中的數據庫DDL中可以看出表名的變化
catalog屬性:
catalog屬性用於指定數據庫實例名,一般來說persistence.xml文件中必須指定數據庫url,url中將包含數據庫實例
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa" />
當catalog屬性不指定時,新創建的表將出現在url指定的數據庫實例中
當catalog屬性設置名稱時,若數據庫存在和指定名稱一致的實例,新創建的表將出現在該實例中,
@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))
所以該屬性一般不需要設置
schema屬性:
作用與catalog屬性作用一致,可自行測試
uniqueConstraints屬性:
uniqueConstraints屬性用於設定約束條件
@Table(name="CUSTOMERS",uniqueConstraints={@UniqueConstraint(columnNames={"name"})}) @Entity public class Customer { private Integer id; private String name; private String email; private int age; ...... }
數據庫DDL:
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列的值不能重復
約束也可以是多列約束
@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的相同記錄
比如:存在一條記錄id=1,name=”張三”,email=”zhangsan@163.com”,那么就不能有另一個id表示的記錄name=”張三”,email=”zhangsan@163.com”
數據庫DDL:
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是一個數組,可以指定多組約束:
uniqueConstraints={@UniqueConstraint(columnNames={"name","email"}),@UniqueConstraint(columnNames={"name","age"})}
數據庫DDL:
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;
總結:
1.當實體類名和數據庫表名不一致時,name屬性可以實現映射,及時表名一致,也推薦使用,提高程序的可讀性
2.catalog和sechema屬性一般不需要指定
3.uniqueConstraints屬性一般也不需要指定,但是如有需要則可以指定