0

对于我当前的项目,我必须使用 hibernate 映射一个遗留数据库,但我遇到了一些问题。数据库是使用一个“实体”表设置的,该表包含所有域对象的公共属性。属性包括(除其他外)创建日期、所有者(用户)和随后在表中用于域对象的主键。

上下文的简单表示如下:

table entity
 - int id
 - varchar owner

table account
 - int accountid (references entity.id)

table contact
 - int contactid (references entity.id)
 - int accountid (references account.accountid)

当我尝试将集合映射添加到我的帐户映射时,我的问题就出现了,其中包含属于该帐户的所有联系人。我的尝试归结为以下几点:

<hibernate-mapping>
    <class name="Contact" table="entity">
        <id name="id" column="id">
            <generator class="native" />
        </id>
        <join table="contact">
            <key column="contactid"/>
            <!-- more stuff -->
        </join> 
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="Account" table="entity">
        <id name="id" column="id">
            <generator class="native" />
        </id>


        <bag name="contacts" table="contact">
            <key column="accountid" />
            <one-to-many class="Contact"/>
        </bag> 

        <join table="account">
            <key column="accountid"/>
            <!-- more stuff -->
        </join>

    </class>
</hibernate-mapping>

但是,当我尝试获取帐户时,我收到一条 SQL 错误,指出实体表不包含名为 accountid 的列。我明白为什么会发生这种情况:当我希望它在联系人表中查找时,映射会尝试在实体表中查找 accountid 列。我在这里遗漏了一些明显的东西,还是应该从另一个方向解决这个问题?

4

1 回答 1

3

在我看来,您实际上需要使用 Table Per Subclass 范例来映射继承。

像这样的东西:

<class name="entity" table="entity">
    <id name="id" column="id">
        ...
    </id>

    <joined-subclass name="contact" table="contact">
        <key column="contactid"/>
    </joined-subclass>

    <joined-subclass name="account" table="account">
        <key column="accountid"/>
    </joined-subclass>
</class>

顺便说一句,这是近似的——它在 Hibernate 文档的第 9.1.2 节中有详细描述(以防万一你找不到它,它被称为“每个子类的表”)。

干杯

富有的

于 2009-03-03T11:39:20.003 回答