论坛首页 入门讨论版 Java

怎样把oracle中由trigger产生的主键 ,在hibernate的hbm文件中给正确定义

浏览 108 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-08-09
记录在oracle表中主键是用trigger生成如下
CREATE OR REPLACE TRIGGER bi_auto
BEFORE
insert on autos
for each row
begin
  if :NEW."autoID" is null then
    select "autoID_SEQ".nextval into :NEW."autoID" from dual;
  end if;
end;
请问在 hibernate hbm文件中怎样对autoID 定义???

在hibernate的文档中 如下
5.1.4.6. 触发器实现的主键生成器(Primary keys assigned by triggers)

仅仅用于遗留的schema中 (Hibernate不能使用触发器生成DDL)。

<id name="id" type="long" column="person_id">
        <generator class="select">
                <param name="key">socialSecurityNumber</param>
        </generator>
</id>

在上面的例子中,类定义了一个命名为socialSecurityNumber的唯一值属性, 它是
一个自然键(natural key),命名为person_id的代理键(surrogate key) 的值
由触发器生成。

=================================
不知道socialSecurityNumber到底是指啥, 既然id是触发器生成 ,,干吗要socialSecurityNumber呢
   
最后更新时间:2008-08-09
因为你的触发器实际上还是从sequence取得值来作为主键的,你完全可以配置Hibernate直接使用sequence类型的generator
   
0 请登录后投票
最后更新时间:2008-08-09
谢谢,这个是可以用sequence, 但是如果用触发器该怎么办呢,因为有几张表的主键是用sequence在加函数生成的, 所以多问一句。
movingboy 写道
因为你的触发器实际上还是从sequence取得值来作为主键的,你完全可以配置Hibernate直接使用sequence类型的generator
   
0 请登录后投票
最后更新时间:2008-08-09
那你只能用select类型的generator了。以你的例子为例,你指定了名为socialSecurityNumber的属性作为自然键(也就是我们通常说的业务键,可以从业务上唯一地识别一条记录),Hibernate在新增记录后会执行一条类似如下的语句取得主键值:

select person_id from ... where social_security_number = ...


不过在Hibernate的源码中说明了,使用这种类型的generator不支持包含多个字段的自然键
   
0 请登录后投票
论坛首页 入门讨论版 Java

跳转论坛:
JavaEye推荐