Hibernate进阶之ID主键生成策略

我们在学习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>

第五种和第六种以此类推。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值