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

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

  • 23
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值