hibernate使用oracle的sequence

一、在很多情况下,我们使用Hibernate在已经建立好数据库的基础上。在oracle中,如果已经建立好的数据库中使用了sequence,则可以按照下面的步骤把它引入到Hibernate中:
  
   1、在oracle 首先创建sequence

      create sequence seq_id
      minvalue 1
      start with 1
      increment by 1
      cache 20;

   1.2或者用PLSQL Developer-->文件-->新建-->序列-->指定最小值、开始、增长、高速缓存大小

   2.在你的hbm.xml中的配置
   
     <class name="com.kay.pojo.Student" table="STUDENT" schema="KAY">
        <id name="id" type="java.lang.Long">
            <column name="ID" precision="22" scale="0" />
            <generator class="sequence">
             <param name="sequence">pk</param>//pk为sequence名称
            </generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="50" />
        </property>
    </class>

   这样再插入数据的时候,Hibernate回自动生成如下语句:
  
   hibernate: select seq_id.nextval from dual

   hibernate:  insert into YXJK.T_YXJK_WHRYTXL (XM0000, ZW0000, LXDH00, SJHM00, DZYJ00,  
                    IP0000,     ID0000) values (?, ?, ?, ?, ?, ?, ?)

   自动生成下一个序列值,然后将对象插入表中。
   在使用的时候需要注意,Hibernate对于sequence的主键的要求是一定要是shor,long,或者integer  .

二、还有一种方式是使用公共的sequence, 这各时候可以不指定表使用的sequence,那么相应的hbm.xml中内容是:

  然后创建公用的 sequence对象,命名为 hibernate_sequence

  create sequence hibernate_sequence

  minvalue 0

  maxvalue 99999999

  start with 10000

  increment by 1;

三、 注意事项

  如果数据库是从sqlserver等其他数据库移植而来的,那么创建sequence时的起始值应该比当前表中最大的ID值大,否则会出现错误,因为sequence 不会维护是否和导库前现有的值重复。

  1、sequence:用于Oracle数据库

  序列名

  2、native:跨数据库时使用,由底层方言产生。

  Default.sequence为hibernate_sequence

  注:使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。如果Oracle中没有该序列,连Oracle数据库时会报错。

四、Hibernate在自增量上的设计缺陷

    前两天在做莱芜供电公司EIP项目集成的时候,一个平时运行很正常,但却突然出现了问题(好比我们用System.out.println(1+1);会 输出2,但有一天发现它居然输出3),在做dao.save(obj)操作时,平时能得到PO的ID号,这时候居然出错了,也就是Subclass的级联 PO的ID老是出错,我从hbm.xml文件查起,至到oracle的trigger到sequence找了半天,最后发现了Hibernate有一个 BUG(可能也不叫BUG,而是使用场合的局限性吧)。
 
   hibernate在跨tablespaces操作时,在维护增量是会出现其在设计上的缺陷,也就是当你的PO是跨tablespace设计的时候,在做 dao.save(obj)等类似操作时,由于不同的tablespace上的sequence的增量不同,所以会引起subclass的ID号与数据库 记录的ID号是不一致的,也就是session中的对象的ID号是错误的,这是因为hibernate在作save操作后,在session中对象的ID 号是直接从hibernate中本次自增量直接获取然后执行setId(),而不是从DB再做一次select语句行到的。(hibernate的主健自 增量有不同的设置,如native,assigned等,详写Hibernate手册)

猜你喜欢

转载自hnhhshun-126-com.iteye.com/blog/1577593