hibernate 与oracle在id自增长sequence的思考与总结

可能遇到的问题

Hibernate: select hibernate_sequence.nextval from dual	 Caused by: java.sql.SQLException: ORA-02289: 序列(号)不存在”
Caused by: java.lang.IllegalArgumentException: argument type mismatchCaused by: java.lang.IllegalArgumentException: argument type mismatch

还有一个是只支持int long sting 那个错误

 

解决方法

1 table sql

这里只是简述number 这个字段,id一般增长都用这个,建议用number(18),小于等于18映射到hibernate都是long类型,超过了都是BigDecimal,后面的这个类型很不好处理,或许我没看到,但是我是在不建议用这个,搜索好长时间都没解决,改成string或者什么的都会提示类型不支持BigDecimal,要么就是不匹配字段。网上有个很例外的解决方案,

<generator class="com.mypackage.BigDecimalGenerator"> 
  <param name="sequence">MYTEMP_TEMP_ID_SEQ</param> 
</generator> 

没有测试。。。应该还需要类

2 sequence

这个大家晚上都能搜索到好多,不多说,上代码

-- Create sequence 
create sequence SEQ_KDZJ_RIBAO
minvalue 1
maxvalue 999999999999999999999999999
start with 201
increment by 1
cache 100;


3 触发器

CREATE OR REPLACE TRIGGER tgi_kdzj_ribao BEFORE INSERT ON kdzj_ribao FOR EACH ROW 
when (new.gzid is null)
begin
select seq_kdzj_ribao.nextval into:new.gzid from dual;
end;

 

在hibernate应用是分为两种情况

1 table sql 加上sequence  不用触发器,适用于新建数据库

hibernate代码为

    <id name="gzid" type="java.lang.Long">
            <column name="GZID" precision="18" scale="0" />
            <generator class="sequence" >
                <param name="sequence">SEQ_KDZJ_RIBAO</param>
            </generator>
        </id>

即可生成成功,

2 table sql 加上sequence 加上触发器,适用于兼容多种数据库的情况,这边不用变

如果你创建的sequence命名为hibernate_sequence(这个名字好像是hibernate默认的 sequence名字,不创建会出错的)

 <id name="gzid" type="java.lang.Long">
            <column name="GZID" precision="18" scale="0" />
            <generator class="native"/>
        </id>

即可生成成功

如果不是,则需要在里面类似于方法1中的那样注明sequence

  <param name="sequence">SEQ_KDZJ_RIBAO</param>

即可生成成功

 

你可能感兴趣的:(oracle,Hibernate,数据库,table,Class,generator)