使用hibernate进行传统映射

时间:2009-03-03 11:15:05

标签: java hibernate mapping

对于我当前的项目,我必须使用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列。我在这里遗漏了一些明显的东西,还是应该从另一个方向处理这个问题?

1 个答案:

答案 0 :(得分: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节中有详细描述(以防你找不到它,它被称为“每个子类的表”)。

干杯