Hibernate主键生成的方式[转]

Hibernate主键的生成方式
1.assigned所有数据库都适用
在调用save()方法之前,要对主键设值,不设值报错

2.increment按照数据库的一个顺序值来增长
适用于mysql,oracle,db2,sqlserver,h2等数据库
每次新增前,都会查询主键的最大值,然后在其基础上加1,作为新增的主键值

3.identity根据底层数据库的能力,来作为主键的自增长策略
适用于mysql,db2,sqlserver等,不适用于oracle

4.sequence根据底层数据库支持的能力,来作为主键值的生成策略
适用于oracle,db2数据库,不适用于mysql,sequence数据库

user5.seq_aa

5.native根据底层数据库支持的自增长能力,自动选择hilo,identity,sequence其中一个来完成该主键的自增长
mysql数据库中:

oracle数据库中:

seq_aa

6.uuid主键为varchar类型
生成16进制32位的字符串类型,生成的数据唯一.
适用于mysql,oracle,sqlserver,db2等数据库

7.foreign:
悲观锁:一个典型的倚赖数据库的悲观锁调用:
select * from account where name=“Erica” for update
这条 sql 语句锁定了 account 表中所有符合检索条件( name=“Erica” )的记录。 本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。
Hibernate 的悲观锁,也是基于数据库的锁机制实现。
下面的代码实现了对查询记录的加锁:
String hqlStr = “from TUser as user where user.name=‘Erica’”;
Query query = session.createQuery(hqlStr);
query.setLockMode(“user”,LockMode.UPGRADE); // 加锁
List userList = query.list();// 执行查询,获取数据
query.setLockMode 对查询语句中,特定别名所对应的记录进行加锁(我们为TUser 类指定了一个别名"user"),这里也就是对返回的所有 user 记录进行加锁。
观察运行期 Hibernate 生成的 SQL 语句:
select tuser0_.id as id, tuser0_.name as name, tuser0_.group_id as group_id, tuser0_.user_type as user_type, tuser0_.sex as sex from t_user tuser0_ where (tuser0_.name=‘Erica’ ) for update
这里 Hibernate 通过使用数据库的 for update 子句实现了悲观锁机制。
Hibernate 的加锁模式有:
Ø LockMode.NONE : 无锁机制。
Ø LockMode.WRITE : Hibernate 在 Insert 和 Update 记录的时候会自动 获取。
Ø LockMode.READ : Hibernate 在读取记录的时候会自动获取。 以上这三种锁机制一般由 Hibernate 内部使 用,如 Hibernate 为了保证 Update过程中对象不会被外界修改,会在 save 方法实现中自动为目标对象加上 WRITE 锁。
Ø LockMode.UPGRADE :利用数据库的 for update 子句加锁。
Ø LockMode. UPGRADE_NOWAIT : Oracle 的特定实现,利用 Oracle 的 forupdate nowait 子句实现加锁。

PersonBean.xml文件

<hibernate-mapping>
<class name="com.bwf.code.bean.PersonBean" table="person" schema="user5">
<!-- id标签表示主键 
name 表示模型bena中的属性名称
column 表示表结构中的列名称
generator 表示主键的约束, identity表示主键在数据库中自增长;
-->
<id name="id" type="java.lang.Long">
      <column name="pid" sql-type="int"></column>
      <generator class="sequence">
           <param name="property">user5.seq_aa</param>
      </generator>
</id>

<property name="name" column="pname" type="java.lang.String"></property>
<property name="birthday" column="birthday" type="java.lang.String"></property>

<property name="sex" column="sex"></property>
<property name="phone"></property>
</class>
</hibernate-mapping>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值