Java 使用联接表映射休眠自表多对一

Java 使用联接表映射休眠自表多对一,java,hibernate,orm,Java,Hibernate,Orm,我的大脑抽筋,想弄清楚这张地图 这是我的数据库: CUSTOMER CUSTOMERFAMILY CUSTOMER PK SITE_ID -----------PRIMARYSITE_ID -- PK SITE_ID MEMBERSITE_ID -------------| 这将创建一个关系,其中客户只能有一个父级(因为CUSTOMERFAMILY.MEMBERSITE\

我的大脑抽筋,想弄清楚这张地图

这是我的数据库:

CUSTOMER              CUSTOMERFAMILY                CUSTOMER
PK SITE_ID -----------PRIMARYSITE_ID             -- PK SITE_ID
                      MEMBERSITE_ID -------------|
这将创建一个关系,其中客户只能有一个父级(因为CUSTOMERFAMILY.MEMBERSITE\u ID上有唯一的约束),而客户可以有多个子级。(即百事公司拥有FritoLay、Gatorade等,因此百事公司将有几个孩子,但Gatorade只有一个家长:百事公司)

我试图在我的客户对象中映射一个名为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>

主站点ID
有什么想法吗

提前谢谢

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

假设您有

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:无效标识符