@Table 注解用来为拥有 @Entity 注解的实体类指定主数据表名称。你还可以使用 @SecondaryTable 或 @SecondaryTables 注解为实体指定其他表。
如果没有为实体类指定 @Table 注解,则实体类将使用默认值表名。默认表名称规则如下:
如果 @Entity 注解不与 @Table 注解结合,则默认将实体名称转换成小写后作为表名称。
如果使用 @Entity 注解的 name 属性且没有与 @Table 结合,则默认将 name 属性的值转换成小写后作为表名称
// 如果 @Entity 不指定 name 属性,则将使用实体名称作为表名,即 userentity @Entity public class UserEntity { //... } // 如果 @Entity 使用 name 属性指定实体名称,则将使用指定的实体名称作为表名,即 ue @Entity(name = "UE") public class UserEntity { //... }
@Table 注解还提供了4个可选的属性,分别如下:
name 属性用于指定数据库表名称,若不指定则以实体类名称作为表名,可以参考前面。实例:
@Entity @Table(name = "users") public class UserEntity { // ... }
catalog 是可选属性,用于指定数据库实例名,一般来说 persistence.xml 文件中必须指定数据库 url,url 中将包含数据库实例。如下:
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/openjpa_learn" />
当不指定 catalog 属性时,新创建的表将出现在 url 指定的数据库实例中。
当设置了 catalog 属性名称时,若数据库存在和指定名称一致的实例,新创建的表将出现在该实例中。
@Entity @Table(name = "users", catalog = "openjpa_learn1", schema = "openjpa_learn1") public class UserEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; //... }
上面实例中,将在数据库 openjpa_learn1 实例中将创建一张名叫 User4 的新表;若数据库不存在和指定名称一致的实例,则创建表失败,提示如下错误 信息:
Exception in thread "main" <openjpa-2.4.2-r422266:1777108 fatal general error> org.apache.openjpa.persistence.PersistenceException: Table 'openjpa_learn1.users' doesn't exist {prepstmnt 1292040526 SELECT t0.id, t0.age, t0.name FROM openjpa_learn1.users t0} [code=1146, state=42S02] FailedObject: select t from User4 t [java.lang.String]
一般情况下,该属性一般不需要设置。
作用与 catalog 属性作用一致,可自行测试。
uniqueConstraints 属性用于设定约束条件。假设 users 数据表 SQL 脚本如下:
CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(255) DEFAULT NULL COMMENT '姓名', `age` int(10) unsigned DEFAULT NULL COMMENT '年龄', PRIMARY KEY (`id`), UNIQUE KEY `UNIQUE_NAME` (`name`) USING BTREE, UNIQUE KEY `UNIQUE_NAME_AGE` (`name`,`age`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
上面 SQL 脚本定义了两个唯一约束,分别是 name 列;和复合唯一约束“name+age”;
实例1:在 @Table 中使用 uniqueConstraints 属性声明 name 唯一约束,代码如下:
@Entity @Table(name = "users", uniqueConstraints = { @UniqueConstraint(columnNames = "name") }) public class UserEntity { // ... }
上面实例中为 name 列设定约束条件,name 列不允许重复。
实例2:uniqueConstraints 属性也可以设置多列约束,即复合约束,如下:
@Entity @Table(name = "users", uniqueConstraints = { @UniqueConstraint(columnNames = {"name", "age"}) }) public class UserEntity { //... }
上面实例指定了“name + age”列的复合唯一约束。此时,在 users 表中不同时存在 name+age 列相同的记录。比如:存在一条记录 id=1, name="ZhangSan", age=20,那么就不能有另一个 id 表示的记录 name="ZhangSan", age=20。
实例3:由于 uniqueConstraints 属性接收一个数组,因此我们可以定义多个约束条件。例如:
@Entity @Table(name = "users", uniqueConstraints = { @UniqueConstraint(columnNames = "name"), @UniqueConstraint(columnNames = {"name", "age"}) }) public class UserEntity { //... }
上面实例指定了 name 列约束和复合约束 name + age 列。