JPA @Table 注解詳解


@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屬性一般也不需要指定,但是如有需要則可以指定


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM