Hibernate中domain配置文件
将主键改成自增长类型:
Oracle设置<generator class="
increment" />
SQLServer 2000设置<generator class="
identity" />
―――――――――例如
SQLServer 2000
中――――――――――――――――――
<
id
name
=
"userid"
type
=
"java.lang.Integer"
>
<
column
name
=
"userid"
/>
<generator class="identity" />
</
id
>
―――――――――――――――――Oracle
中――――――――――――――――――
<
id
name
=
"userid"
type
=
"java.lang.Integer"
>
<
column
name
=
"userid"
/>
<generator class="increment" />
</
id
>
hibernate
提供了产生自动增长类型主键的多种策略
,
这里以
increment
为例说明具体用法
:
1 、在数据库中建立表,主键名称为 ID, 类型为 varchar2 (字符串型)
2 、在 **.hbm.xml ( hibernate 映射文件)中配置如下
<class name="com.jat.bisarea.ho.Test" table="BA_VVTEST">
<id name="id" type="int" column="ID">
// 该句指定使用 hibernate 自带的 increment 策略生成主键
<generator class="increment"/>
</id>
<property name="uname" type="java.lang.String" column="UNAME"/>
</class>
3 、在 java 文件中对表增加记录时,只需添加除 ID 外的其他字段,然后 save 即可,相关 java 代码如下:
Session s = HibernateUtil.currentSession();
Transaction tx = s.beginTransaction();
Test test = new Test();
String uname = httpServletRequest.getParameter("uname");
test.setUname(uname);
// 只需对 uname 进行 set , id 由 hibernate 生成
s.save(test);
tx.commit();
4 、使用其它策略的方法基本一致,例如 hilo 、 seqhilo 等
Generator 为每个 POJO 的实例提供唯一标识。一般情况,我们使用 “native” 。 class 表示采用由生成器接口 net.sf.hibernate.id.IdentifierGenerator 实现的某个实例,其中包括:
“assigned”
主键由外部程序负责生成,在 save() 之前指定一个。
“hilo”
通过 hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
“seqhilo”
与 hilo 类似,通过 hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence ,适用于支持 Sequence 的数据库,如 Oracle 。
“increment”
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加 1 作为主键。这种方式可能产生的问题是:不能在集群下使用。
“identity”
采用数据库提供的主键生成机制。如 DB2 、 SQL Server 、 MySQL 中的主键生成机制。
“sequence”
采用数据库提供的 sequence 机制生成主键。如 Oralce 中的 Sequence 。
“native”
由 Hibernate 根据使用的数据库自行判断采用 identity 、 hilo 、 sequence 其中一种作为主键生成方式。
“uuid.hex”
由 Hibernate 基于 128 位 UUID 算法 生成 16 进制数值(编码后以长度 32 的字符串表示)作为主键。
“uuid.string”
与 uuid.hex 类似,只是生成的主键未进行编码(长度 16 ),不能应用在 PostgreSQL 数据库中。
“foreign”
使用另外一个相关联的对象的标识符作为主键。
1 、在数据库中建立表,主键名称为 ID, 类型为 varchar2 (字符串型)
2 、在 **.hbm.xml ( hibernate 映射文件)中配置如下
<class name="com.jat.bisarea.ho.Test" table="BA_VVTEST">
<id name="id" type="int" column="ID">
// 该句指定使用 hibernate 自带的 increment 策略生成主键
<generator class="increment"/>
</id>
<property name="uname" type="java.lang.String" column="UNAME"/>
</class>
3 、在 java 文件中对表增加记录时,只需添加除 ID 外的其他字段,然后 save 即可,相关 java 代码如下:
Session s = HibernateUtil.currentSession();
Transaction tx = s.beginTransaction();
Test test = new Test();
String uname = httpServletRequest.getParameter("uname");
test.setUname(uname);
// 只需对 uname 进行 set , id 由 hibernate 生成
s.save(test);
tx.commit();
4 、使用其它策略的方法基本一致,例如 hilo 、 seqhilo 等
Generator 为每个 POJO 的实例提供唯一标识。一般情况,我们使用 “native” 。 class 表示采用由生成器接口 net.sf.hibernate.id.IdentifierGenerator 实现的某个实例,其中包括:
“assigned”
主键由外部程序负责生成,在 save() 之前指定一个。
“hilo”
通过 hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。
“seqhilo”
与 hilo 类似,通过 hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence ,适用于支持 Sequence 的数据库,如 Oracle 。
“increment”
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加 1 作为主键。这种方式可能产生的问题是:不能在集群下使用。
“identity”
采用数据库提供的主键生成机制。如 DB2 、 SQL Server 、 MySQL 中的主键生成机制。
“sequence”
采用数据库提供的 sequence 机制生成主键。如 Oralce 中的 Sequence 。
“native”
由 Hibernate 根据使用的数据库自行判断采用 identity 、 hilo 、 sequence 其中一种作为主键生成方式。
“uuid.hex”
由 Hibernate 基于 128 位 UUID 算法 生成 16 进制数值(编码后以长度 32 的字符串表示)作为主键。
“uuid.string”
与 uuid.hex 类似,只是生成的主键未进行编码(长度 16 ),不能应用在 PostgreSQL 数据库中。
“foreign”
使用另外一个相关联的对象的标识符作为主键。
1. native
我最常用的。可以保证多个数据库之间的可移植性。但是有可能有时候会有问题:因为不能控制 id 值,在数据倒表的时候可能无法满足业务需要。
2. sequence
这种地方可以解决上面用 native 时候的问题,但是需要堆数据库做一些其他配置。
3. uuid
理论上可以保证多个数据库生成的 ID 在一个系统里唯一,有时候挺有用。但是效率稍微低点(其实都无所谓)。
4. increment
最好不要用。如果有其他程序访问、修改数据库,那就恐怖了。
5. assigned
没怎么用过。一般不会用手工方式赋值主键,除非有特殊的需求。
6. foreign
在 one-to-one 的时候可能会用到。
7. 在使用数据库自动生成主键的时候, SQL 语句会有所不同:有些数据库不许你填主键,有些要求你该字段必须为 null ,有些会完全忽略你写的主键的值。
我最常用的。可以保证多个数据库之间的可移植性。但是有可能有时候会有问题:因为不能控制 id 值,在数据倒表的时候可能无法满足业务需要。
2. sequence
这种地方可以解决上面用 native 时候的问题,但是需要堆数据库做一些其他配置。
3. uuid
理论上可以保证多个数据库生成的 ID 在一个系统里唯一,有时候挺有用。但是效率稍微低点(其实都无所谓)。
4. increment
最好不要用。如果有其他程序访问、修改数据库,那就恐怖了。
5. assigned
没怎么用过。一般不会用手工方式赋值主键,除非有特殊的需求。
6. foreign
在 one-to-one 的时候可能会用到。
7. 在使用数据库自动生成主键的时候, SQL 语句会有所不同:有些数据库不许你填主键,有些要求你该字段必须为 null ,有些会完全忽略你写的主键的值。