【问题标题】:Hibernate self table many-to-one with join table mappingHibernate self 表多对一与连接表映射
【发布时间】:2010-11-09 19:31:41
【问题描述】:

想弄清楚这个映射,我脑子抽筋了。

这是我的数据库:

CUSTOMER              CUSTOMERFAMILY                CUSTOMER
PK SITE_ID -----------PRIMARYSITE_ID             -- PK SITE_ID
                      MEMBERSITE_ID -------------|

这会创建一种关系,其中客户只能有一个父级(因为对 CUSTOMERFAMILY.MEMBERSITE_ID 有唯一的约束),而客户可以有多个子级。 (即百事公司拥有菲多利、佳得乐等,因此百事可乐将有几个孩子,但佳得乐只有一个父母:百事可乐)。

我正在尝试在我的 Customer 对象中映射一个名为 parent 的属性,我已经尝试了这个想法的许多组合但没有成功:

<join table="CUSTOMERFAMILY" inverse="false">
    <key column="MEMBERSITE_ID" unique="true" />
    <many-to-one name="parent" column="SITE_ID" not-null="true"><formula>PRIMARYSITE_ID</formula></many-to-one>
</join>

有什么想法吗??

提前致谢。

(请不要问为什么数据库是这样设计的......遗留系统,不是我的!;))

【问题讨论】:

    标签: java hibernate orm


    【解决方案1】:

    假设你有

    private Customer parent;
    private Set<Customer> children;
    

    映射如下所示:

    <set name = "children" table = "CUSTOMERFAMILY">            
        <key column="PRIMARYSITE_ID" />
        <many-to-many column = "MEMBERSITE_ID" entity-name="package.Customer" />
    </set>
    
    <join table="CUSTOMERFAMILY" inverse="true">
        <key column="MEMBERSITE_ID" />
        <many-to-one name="parent" column = "PRIMARYSITE_ID" />
    </join>
    

    【讨论】:

    • 太棒了!谢谢!这有效,现在,如果我想使用命名查询来加载客户,我会收到错误 PRIMARYSITE_ID: invalid identifier