首先给出我的实体配置,这里为了方便就只给一个表了
步骤一:首先在Oracle10g中,创建了序列User_SEQ,语句如下
create sequence User_SEQ
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 20;
步骤二:然后创建一个针对表User的触发器User_trig
create or replace trigger User_trig
  before insert on User  
  for each row
begin
  select User_seq.nextval into:new.user_id from dual;
end User_trig;
步骤三:在Hibernate的实体映射xml中,写下如下代码<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="entity.user" table="user" select-before-update="true">
<id name="id" type="java.lang.Integer">
<column name="user_id" />
<generator class="sequence" >
                <param name="sequence">admin_seq</param>
            </generator>
</id> <property name="name" type="java.lang.String">
<column name="admin_name" length="20" not-null="true" />
</property>
<property name="pass" type="java.lang.String">
<column name="admin_pass" length="20" not-null="true" />
</property>
</class>
</hibernate-mapping>
  运行程序,进行用户注册,可以实现注册功能。序列也是自动添加,但是,序列的值有些不大一样。
例如,插入user1用户时,user_id的序列值为1;
但是在插入user2用户时,user_id的序列值为4;
也就是插入一条值时,序列增长了3而不是1;但是,在Oracle的表中直接插入值时,触发器是正常的,每次只自动增加1,请问各位是什么问题啊,谢谢

解决方案 »

  1.   

    刚xml给错实体了,实际是<?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="entity.user" table="user" select-before-update="true">
            <id name="id" type="java.lang.Integer">
                <column name="user_id" />
                <generator class="sequence" >
                    <param name="sequence">user_seq</param>
                </generator>
            </id>        <property name="name" type="java.lang.String">
                <column name="user_name" length="20" not-null="true" />
            </property>
            <property name="pass" type="java.lang.String">
                <column name="user_pass" length="20" not-null="true" />
            </property>
        </class>
    </hibernate-mapping>
      

  2.   

    查资料,据说是Hibernate和oracle的触发器似乎在协同工作上不是很好。因为Hibernate会自动添加序列,oracle中的触发器也会,所以一般是执行两次。
    不过我这里是3次,抱着试试的态度,禁掉Oracle的相关触发器,发现次数减少了一次。即原来序列1,插入一条是4;现在序列1,插入一条是3,不知道问题出在哪里?
    另外,我还是想保持Oracle数据库的完整性,即保证触发器的存在,又不与Hibernate中的冲突,请问有什么方法吗