为自引用表hibernate映射生成id

时间:2011-08-19 20:30:20

标签: hibernate db2

您好我有一个关于DB2数据库的表,如下所示:

id(PKey) doc_id(FKey指向id)not null

这是一个奇怪的遗产表,我无法改变。我也不能写/修改触发器。

我正在尝试为此表创建一个hibernate映射,但我无法弄清楚如何编写这种奇怪的关系。

我有两个选择: 1-告诉Hibernate将id和doc_id保留为null然后触发器将为我设置值。

2-找出一种方法告诉hibernate使用序列一次设置两个值的值。

我似乎找不到告诉hibernate这样做的方法吗?

非常感谢任何帮助。

<id name="id" type="java.lang.Long" column="ID">
        <generator class="sequence">
            <param name="sequence">SQ_DCMNT</param>
        </generator>
</id>

<property name="packageDcmntId" generated="insert">
        <column name="PACKAGE_DCMNT_ID" not-null="true"/>
</property>

1 个答案:

答案 0 :(得分:1)

我会将此实体配置为使用SequenceGeneratorSequenceHiLoGenerator的自定义子类来生成其ID。这个自定义子类将覆盖生成方法,如下所示:

@Override
public Serializable generate(final SessionImplementor session, Object obj) {
    Serializable result = super.generate(session, obj);
    ((MyBizarreEntity) obj).setPackageDcmntId((Long) result);
    return result;
}

这样,在插入之前,实体的属性将自动具有生成的ID的值,这是必需的,因为该列具有非空约束。

我没有测试它,但它应该可以工作。

或者你可以只为ID使用常规序列生成器,确保访问类型是属性而不是 field ,并实现setId像这样的方法:

/**
 * Sets the ID as well as the packageDcmntId, since they share the same value
 */
public void setId(Long id) {
    this.id = id;
    this.packageDcmntId = id;
}