Самореферентный класс в Hibernate или дополнительной таблице - PullRequest
1 голос
/ 07 декабря 2011


У меня довольно распространенная проблема, но я не знаю, как решить ее на практике и объяснить свой выбор / решение.
У меня есть ситуация, когда в базе данных есть две таблицы: Учетная запись и Контакт . Они оба представляют одни и те же данные, потому что один человек (Учетная запись) может иметь в списке контактов только тех людей, которые также имеют учетные записи в созданной системе. Так что это классическая связь один-ко-многим между таблицей Account и Contact.
Я решил использовать такую ​​модель, что вместо одной есть две таблицы, ссылающиеся на себя. Я не уверен, что выбрал хорошо.
Вот как выглядят эти таблицы:

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 Ответ

2 голосов
/ 07 декабря 2011

Дополнительная таблица является просто таблицей соединений для отношений «многие ко многим» между Учетной записью (как лицо / владелец) и Учетной записью (как контакт / владелец). Человеку принадлежит много контактов, а контакту владеют несколько человек.

То есть у вас должна быть уникальная сущность со следующей ассоциацией:

@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;
}
...