@Table 注解

@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

name 属性用于指定数据库表名称,若不指定则以实体类名称作为表名,可以参考前面。实例:

@Entity
@Table(name = "users")
public class UserEntity {
    // ...
}

catalog

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]

一般情况下,该属性一般不需要设置。

schema

作用与 catalog 属性作用一致,可自行测试。

uniqueConstraints

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 列。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号