@table 注解详解及使用 | 您所在的位置:网站首页 › 抖音黑科技热门技术 › @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中将包含数据库实例 当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=”[email protected]”,那么就不能有另一个id表示的记录name=”张三”,email=”[email protected]” 数据库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中将包含数据库实例 当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=”[email protected]”,那么就不能有另一个id表示的记录name=”张三”,email=”[email protected]” 数据库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属性一般也不需要指定,但是如有需要则可以指定 |
CopyRight 2018-2019 实验室设备网 版权所有 |