1、increment标识符生成器
由Hibernate以递增的方式为代理主键,例如:
<hibernate-mapping>
<class name="mypack.IncrementTester" table="INCREMENT_TESTER" >
<id name="id" type="long" column="ID" >
<meta attribute="scope-set">private</meta>
<generator class="increment" />
</id>
<property name="name" type="string">
<column name="NAME" length="15" />
</property>
</class>
</hibernate-mapping>
Hibernate在持久化一个IncrementTester对象时,会以递增的方式生成标识符,事实上,Hibernate在初始化阶段读取INCREMENT_TESTER表中最大主键值,接下来向INCREMENT_TESTER表中插入记录时,就在max(ID)基础上递增,增量为1。下面考虑有两个Hibernate应用进程访问同一个数据库的情景。
(1)假定第一个进程中的Hibernate在初始化阶段读取INCREMENT_TESTER表中最大主键为6
(2)第二个进程中的Hibernate在初始化阶段读取INCREMENT_TESTER表中最大主键仍然为6
(3)接下来两个进程中的Hibernate各自向INCREMENT_TESTER表中插入主键为7的记录,这违反了数据库完整性约束,导致有一个进程的插入操作失败。
由此看见,increment标识符生成器仅仅在单个Hibernate应用进程访问数据库的情况下才能有效工作。更确切的说,即使在同一个进程中创建了连接同一个数据库的多个SessionFactory实例,也会导致插入操作失效。在J2EE软件架构中,Hibernate通常作为JNDI资源运行在应用服务器上。
increment标识符生成器具有以下适用范围:
1、由于increment生成标识符的机制不依赖于底层数据库系统,因此他适用于所有的数据库系统
2、适用于只有单个Hibernate应用进程访问同一个数据库的场合,在集群环境下不推荐使用
3、OID必须为long,int或short类型,如果把OID定义为byte类型,在运行时会抛出以下异常:
[java] net.sf.hibernate.id.IdentifierGenerationException:this id generator generates long,integer,short,identity