Hibernate或附加表中的自引用类

时间:2011-12-07 12:21:34

标签: hibernate jpa-2.0 entity-relationship self-reference


我有很常见的问题,但不知道如何在实践中解决它并解释我的选择/解决方案。
我有一种情况,数据库中有两个表:帐户联系。它们都代表相同的数据,因为一个人(帐户)只能在联系人列表中拥有那些在创建的系统中也有帐户的人。因此,表帐户和联系人之间存在经典的一对多关系。
我选择使用这样的模型,即有两个表而不是一个表,自引用。我不确定我是否选好了。
以下是这些表的外观:

CREATE TABLE account (
    id INT NOT NULL AUTO_INCREMENT,
    login VARCHAR(20) NOT NULL,
    firstName VARCHAR(15) NOT NULL,
    lastName VARCHAR(40) NOT NULL,
    passwordHash CHAR(50) NOT NULL,
    PRIMARY KEY(id));
CREATE TABLE contact (
    ownerid INT NOT NULL,
    contactid INT NOT NULL,
    PRIMARY KEY (ownerid, contactid),
    FOREIGN KEY (ownerid) REFERENCES account(id),
    FOREIGN KEY (contactid) REFERENCES account(id));

我的问题是我不知道如何使用注释构造实体类。我可能已经使用了一些IDE向导,但它不是我的解决方案,因为我甚至无法检查一切是否正确。我宁愿完全理解话题 我的目标是让每个账户都拥有联系人列表。当我从此列表中删除联系人时,帐户不会从帐户表中删除。
我已经阅读了有关级联的内容,但不幸的是我感觉不到这一点。

请告诉我解决这个问题的正确途径。

1 个答案:

答案 0 :(得分:2)

附加表只是一个连接表,用于表示帐户(作为个人/所有者)和帐户(作为联系人/拥有者)之间的多对多关系。一个人拥有许多联系人,联系人由几个人拥有。

因此,您应该拥有一个具有以下关联的唯一实体:

@Entity
public class Account {
    // ...

    @ManyToMany
    @JoinTable(name = "contact",
               joinColumns = @JoinColumn(name="ownerid"),
               inverseJoinColumns = @JoinColumn(name="contactid")
    private Set<Account> contacts;
}

您也可以将其设为双向:

@Entity
public class Account {
    // ...

    @ManyToMany
    @JoinTable(name = "contact",
               joinColumns = @JoinColumn(name="ownerid"),
               inverseJoinColumns = @JoinColumn(name="contactid")
    private Set<Account> contacts;

    @ManyToMany(mappedBy = "contacts")
    private Set<Account> owners;
}