gpt4 book ai didi

java - 使用 hibernate 进行遗留映射

转载 作者:行者123 更新时间:2023-12-02 00:55:48 24 4
gpt4 key购买 nike

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

上下文的简单表示如下:

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 列。我是否在这里遗漏了一些明显的东西,或者我应该从另一个方向解决这个问题?

最佳答案

在我看来,您实际上需要使用“每个子类表”范例来映射继承。

类似这样的事情:

<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 节对此进行了详细描述(以防万一您找不到它,它称为“每个子类的表”)。

干杯

丰富

关于java - 使用 hibernate 进行遗留映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/605986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com