Hibernate学习——(三)ID生成策略介绍
2016-03-06 20:15
190 查看
还记得@Id注解吗?Id即主键,在之前的实验中都是手工指定,然而这样在实际中很容易出错儿,因而在实际中往往采用数据库
自动帮我们生成Id。Hibernate或者说JPA已经实现了通过设置方式使Id自动生成。
先介绍通过XML方式设置的方式。在<id>标签内有一个generator标签,这个标签内部有一个class属性:
1、identity:每次自增1,支持DB2、Mysql、MS SQL Server等,该实体类属性值要求为long,short或者int。
2、sequence:每次自增1,支持DB2,ORACLE等。该实体类属性值要求为long,short或者int。
3、uuid:生成一个128位的UUID码,以32位十六进制数的字符串形式展示。所以要求实体类属性为String。
4、native:让其根据数据库的类型自行选择是采用IDENTITY还是SEQUENCE。(使用最多)
annotation的设置方法就是加入“@GeneratedValue”,放置在@Id下面。默认值为“Auto”。
1、auto:等同于XML方法里的native
2、identity
3、sequence
4、table:自定义一个generator,设置key和value名,将自己含有内容的数据库表作为key,以自己设置的步长开始随着数据库
中内容增加而增加主键的值。eg:
@TableGenerator(name = "Gen_test", table = "GENERATOR_TABLE", pkColumnName = "pk_key", valueColumnName = "pk_value",pkColumnValue = "manager_backup", allocationSize = 5)
name:generator的命名
table:生成的表的表名
pkColumnName:所生成的表的主键名
pkColumnValue:实体表所对应到生成器表中的主键名,这个键名是可以自定义的
valueColumnName:所生成表的值列的名
allocationSize:步长
之后如下设置:
@GeneratedValue(strategy = GenerationType.TABLE, generator = "Gen_test")
按照上面eg中的方法写后,添加3次数据,结果如下图所示:
Table的方法在跨数据库平台中用的最多,但是实际中用的很少。
有时候在实际工作中,需要用到联合主键,即将两个属性联合起来共同作为主键。
第一种XML的方式来设置:
1、将需要作为联合主键的多个对象(记为X)封装成一个类(记为Y)。在这个类中写X的getter,setter方法。同时这个类需
要继承java.io.Serializable接口以及覆写equals()和hashCode()方法
2、在XML中<id>的位置做如下更改的设置:
第二种Annotation版本,有三种写法:
①将需要作为联合主键的多个对象(记为X)封装成一个类(记为Y)。将主键类Y注解为@Embeddable,同时写上getter、setter方法以及继承
java.io.Serializable接口和覆写()及hashCode()方法,在Model类中的该主键对象的getter方法前注解为@Id。
②主键类X中不需要添加任何注解,在Model类中该主键对象的getter方法前将其注解为@EmbeddedId即可。
③不调用Y类的对象,直接在联合主键的几个分主键的getter方法前将其注解为@Id,随后在持久化类前加上注解@IdClass(value=Y.class)
自动帮我们生成Id。Hibernate或者说JPA已经实现了通过设置方式使Id自动生成。
先介绍通过XML方式设置的方式。在<id>标签内有一个generator标签,这个标签内部有一个class属性:
<generator class = "xxx" />常用的class:
1、identity:每次自增1,支持DB2、Mysql、MS SQL Server等,该实体类属性值要求为long,short或者int。
2、sequence:每次自增1,支持DB2,ORACLE等。该实体类属性值要求为long,short或者int。
3、uuid:生成一个128位的UUID码,以32位十六进制数的字符串形式展示。所以要求实体类属性为String。
4、native:让其根据数据库的类型自行选择是采用IDENTITY还是SEQUENCE。(使用最多)
annotation的设置方法就是加入“@GeneratedValue”,放置在@Id下面。默认值为“Auto”。
1、auto:等同于XML方法里的native
2、identity
3、sequence
4、table:自定义一个generator,设置key和value名,将自己含有内容的数据库表作为key,以自己设置的步长开始随着数据库
中内容增加而增加主键的值。eg:
@TableGenerator(name = "Gen_test", table = "GENERATOR_TABLE", pkColumnName = "pk_key", valueColumnName = "pk_value",pkColumnValue = "manager_backup", allocationSize = 5)
name:generator的命名
table:生成的表的表名
pkColumnName:所生成的表的主键名
pkColumnValue:实体表所对应到生成器表中的主键名,这个键名是可以自定义的
valueColumnName:所生成表的值列的名
allocationSize:步长
之后如下设置:
@GeneratedValue(strategy = GenerationType.TABLE, generator = "Gen_test")
按照上面eg中的方法写后,添加3次数据,结果如下图所示:
Table的方法在跨数据库平台中用的最多,但是实际中用的很少。
有时候在实际工作中,需要用到联合主键,即将两个属性联合起来共同作为主键。
第一种XML的方式来设置:
1、将需要作为联合主键的多个对象(记为X)封装成一个类(记为Y)。在这个类中写X的getter,setter方法。同时这个类需
要继承java.io.Serializable接口以及覆写equals()和hashCode()方法
2、在XML中<id>的位置做如下更改的设置:
第二种Annotation版本,有三种写法:
①将需要作为联合主键的多个对象(记为X)封装成一个类(记为Y)。将主键类Y注解为@Embeddable,同时写上getter、setter方法以及继承
java.io.Serializable接口和覆写()及hashCode()方法,在Model类中的该主键对象的getter方法前注解为@Id。
②主键类X中不需要添加任何注解,在Model类中该主键对象的getter方法前将其注解为@EmbeddedId即可。
③不调用Y类的对象,直接在联合主键的几个分主键的getter方法前将其注解为@Id,随后在持久化类前加上注解@IdClass(value=Y.class)
相关文章推荐
- bzoj 1803(主席树)
- 小学生之浅谈Struts2与struts1的运行机制
- Web性能优化——缓存
- 关于UITableView 的一些重用技术注意点
- Android开发系列(十一):对手机通讯录的读取、添加、删除、查找
- mongodb单机配置shard分片集群
- php中使用exec,system等函数调用系统命令
- HDU 5636:Shortest Path floyd
- Swift泛型
- SpringMVC 基于注解的Controller @RequestMapping @Request
- 面包屑导航
- BigPipe——流水线式的动态并行处理
- 浅析设计模式之观察者模式
- C语言模仿C#事件
- Android Volley完全解析(二),使用Volley加载网络图片
- nyoj42 一笔画问题
- 学生的自我修养
- pat 1067 Sort with Swap(0,*) (25)
- python下spark_RDD认识与操作
- ClassLoader:类加载详解