一直用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