我们在学习Hibernate时 肯定会遇到id主键的生成策略,以下是本人学习的中遇到的知识点总结。
hibenate内置主健生成策略:
我们从三个方面进行比较:(1)主键类型;(2)是否依赖于底层数据库;(3)多线程情况下是否安全;
(A)increment
整型
不依赖于底层数据库的自动增长
多线程情况下不安全
通用性强
(B)identity
整型
依赖于底层数据库的自动增长
多线程情况下安全
通用性不强
(C)sequence
专用于oracle数据库服务器
整型
依赖于底层数据库的自动增长
多线程情况下安全
通用性不强
需人工创建create sequence hibernate_sequence;
(D)native【重点】---针对单个代理主健,且整型
个人:hibernte中,id策略的变量
如果底层使用oracle的话,native=sequence,前提你得创建序列
如果底层使用mysql的话,native=identity,前提你得使用auto_increment
(E)uuid----针对单个代理主健,且字符型
字符串
不依赖于底层数据库的自动增长
多线程情况下安全
通用性强
(F)assigned --针对单个自然主健,类型不限
类型不限,由最终自然主健的字段类型决定
不依赖于底层数据库的自动增长
因为主健必须非NULL唯一,
如果二个相同用户名的线程同时访问,会出错
如果二个不相同用户名的线程同时访问,就成功
(G)composite-id --针对多个自然主健,类型不限
类型不限,由最终自然主健的字段类型决定
不依赖于底层数据库的自动增长
因为主健必须非NULL唯一,
如果二个相同用户名的线程同时访问,会出错
如果二个不相同用户名的线程同时访问,就成功
实现序例化:
1)当内存中的对象,要写到硬盘中,该对象需要实现序例化
2)当一个对象,需要在多个线程中传递数据
3)当内存中的对象,要写到数据库中,该对象需要实现序例化
在hibernate中,
如果一个类含有id属性,hibernate自动实现序列化接口,程序员无需实现。如果程序员自行实现,也是可以的 。
第一种:increment主键策略映射文件
<hibernate-mapping package="cn.itcast.javaee.hibernate.id.increment">
<class name="Hero" table="heros">
<id name="id" column="id">
<!-- hibernate使用内部策略,帮你产生id主键值 -->
<generator class="increment"/>
</id>
<property name="name" column="name"/>
<property name="gender" column="gender"/>
</class>
</hibernate-mapping>
第一种:native主键策略映射文件
<hibernate-mapping package="cn.itcast.javaee.hibernate.id.native_">
<class name="Hero" table="heros">
<id name="id" column="id">
<!-- hibernate使用内部策略,帮你产生id主键值 -->
<generator class="native"/>
</id>
<property name="name" column="name"/>
<property name="gender" column="gender"/>
</class>
</hibernate-mapping>
第三种:indentity主键生成策略:
<hibernate-mapping package="cn.itcast.javaee.hibernate.id.identity">
<class name="Hero" table="heros">
<id name="id" column="id">
<!-- hibernate使用内部策略,帮你产生id主键值 -->
<generator class="identity"/>
</id>
<property name="name" column="name"/>
<property name="gender" column="gender"/>
</class>
</hibernate-mapping>
第四种:sequence主键生成策略:
<hibernate-mapping package="cn.itcast.javaee.hibernate.id.sequence">
<class name="Hero" table="heros">
<id name="id" column="id">
<!-- hibernate使用内部策略,帮你产生id主键值 -->
<generator class="sequence"/>
</id>
<property name="name" column="name"/>
<property name="gender" column="gender"/>
</class>
</hibernate-mapping>
第五种和第六种以此类推。