Hibernate遇到oracle之主键生成策略

一直用Hibernate+mysql,感受Hibernate很好用,也出过什么大问题;这周,公司的产品要部署到Orecle,虽然产品号称支持Oracle可是我本身知道,这个产品压根儿就没在Oracle上测试过,更不要是使用了。因而就开始紧罗密布的测试了,问题天然一大堆,如今说一个关于主键生成策略的问题。mysql

首先,众所周知,Hibernate能够自动建表。当咱们把项目部署好,运行的时候发现,确实自动建表了,可是少了不少表,就是有的表生成了,有的表木有生成,这就让人很头疼了。一波操做以后,发现Hibernate配置文件中,主键生产策略有误,下面就给你们总结一下当Hibernate遇到oracle以后,主键生成策略变化。sql


首先在非集群状况下:
能够使用hibernate自带的increment策略生成主键 ,可是increment 实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,以后每次须要生成主键的时候将此值加1做为主键。从根原本讲,主键是在Java虚拟机上产生而不是数据库产生的,因此increment不能在集群环境下使用

所以在集群状况下:
就必须使用sequence策略。若是采用sequence策略,就必须在oracle数据库里面创建序列:数据库

CREATE SEQUENCE emp_sequence  --序列名
INCREMENT BY 1     -- 每次加几个  
START WITH 1        -- 1开始计数  
NOMAXVALUE          -- 不设置最大值  
NOCYCLE               -- 一直累加,不循环  
CACHE 10;oracle

 

固然有的朋友还比较喜欢native这个策略,万金油嘛;可是要注意了在数据库是Oracle的时候,若是不懂native的机制,那就麻烦了。怎么回事呢?若是使用native策略,那么hibernate会自动调用hibernate_sequence这个序列若是没有,那天然就出问题了。因此仍是在oracle数据库要建立一个名为hibernate_sequence的序列。有人觉得反正也要创建sequence为毛要用native啊?不过对于产品化的东西,可能用于多种数据库的东西仍是有必定使用性的,就不用到每次部署的时候先去改hibernate的配置文件了嘛。测试

 

好了基本就这样吧,祝你好运。spa

相关文章
相关标签/搜索