oracle本身不支持主键自增长,可以用序列sequence来表示主键增长
一般来讲用前两种会更好一点,一个自己定义序列,另一个是increment查询后自增长。第三个适合一个映射表的情况,如果多个映射表使用同一序列会造成不便(导致序列可能不连续)。
在Hibernate中,oracle主键自增长有三种方式:
1.使用序列
在映射文件中
<id name="userId" type="int">
<column name="ID" />
<generator class="sequence">
<param name="sequence">hbm_test_id_seq</param>
</generator>
</id>
执行结果
Hibernate: select hbm_test_id_seq.nextval from dual
Hibernate: insert into hbm_test (userName, password, ID) values (?, ?, ?)
可以使用序列hbm_test_id_seq来使得oracle主键自增长。
2.使用对象标示符生成策略---increment
在映射文件中
<id name="userId" type="int">
<column name="ID" />
<generator class="increment">
</generator>
</id>
可以实现主键自增长。由SQL语句可知,其执行了两次SQL操作
Hibernate: select max(ID) from hbm_test
Hibernate: insert into hbm_test (userName, password, ID) values (?, ?, ?)
先是查询主键值,然后再插入,进而实现主键自增长
3.
使用对象标示符生成策略---native
在映射文件中
<id name="userId" type="int">
<column name="ID" />
<generator class="native">
</generator>
</id>
可以实现主键自增长。由SQL语句可知,其执行了两次SQL操作,会自动生成一个序列hibernate_sequence
Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into hbm_test (userName, password, ID) values (?, ?, ?)
一般来讲用前两种会更好一点,一个自己定义序列,另一个是increment查询后自增长。第三个适合一个映射表的情况,如果多个映射表使用同一序列会造成不便(导致序列可能不连续)。