您的位置:首页 > 数据库 > Oracle

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

2012-08-28 17:15 344 查看
可能遇到的问题

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>

即可生成成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐