Как отобразить список «многие ко многим» в Hibernate с помощью таблицы ссылок - PullRequest
7 голосов
/ 23 декабря 2008

Я бы хотел отобразить многие-ко-многим в Hibernate, используя таблицу ссылок. У меня есть два класса, родительский и дочерний класс, например:

public class Parent{

private List<Child> _children;

//...getters and setters
}

Я использую таблицу ссылок (link_table) с тремя столбцами link_id, parent_id и child_id. База данных - сервер SQL, а типы идентификаторов - уникальный идентификатор. Поэтому я обычно использую guid для полей id.

Как вы можете реализовать это, используя тег <list />, если это правильный тег для использования? Знаете ли вы какую-нибудь хорошую документацию для этого?

В настоящее время я получаю исключение ConstraintViolationException, но не смог найти хорошую документацию или примеры этого.

Я думаю, что главная проблема заключается в следующем: как указать link_id, который будет автоматически создан в таблице ссылок.

Ответы [ 4 ]

8 голосов
/ 23 декабря 2008

Я делаю это, используя аннотации, в частности @ManyToMany и @JoinTable:

Документы Hibernate:

@Entity
public class Employer implements Serializable {
    @ManyToMany(
        targetEntity=org.hibernate.test.metadata.manytomany.Employee.class,
        cascade={CascadeType.PERSIST, CascadeType.MERGE}
    )
    @JoinTable(
        name="EMPLOYER_EMPLOYEE",
        joinColumns=@JoinColumn(name="EMPER_ID"),
        inverseJoinColumns=@JoinColumn(name="EMPEE_ID")
    )
    public Collection getEmployees() {
        return employees;
    }
}


@Entity
public class Employee implements Serializable {
    @ManyToMany(
        cascade = {CascadeType.PERSIST, CascadeType.MERGE},
        mappedBy = "employees",
        targetEntity = Employer.class
    )
    public Collection getEmployers() {
        return employers;
    }
}
5 голосов
/ 23 декабря 2008

Я не думаю, что возможно (или необходимо) добавить первичный ключ link_id в таблицу соединений. Таблица объединения обычно состоит из первичных ключей двух участвующих таблиц.

При использовании XML вам понадобится следующий синтаксис:

 <class name="Parent">
    ....
    <list name="children" table="link_table">
    <key column="parent_id"/>
    <many-to-many column="child_id"
        class="Children"/>
    </list>
    ...
 </class>

<class name="Child">
...
<list name="parents" inverse="true" table="link_table">
    <key column="child_id"/>
    <many-to-many column="parent_id"
        class="Parent"/>
</list>
...
</class>

Хотя я считаю, что аннотации лучше использовать.

0 голосов
/ 21 октября 2016

В Интернете я нашел очень хороший блог, в котором есть 2 способа добавить дополнительные поля в столбец спящего режима «многие ко многим». Традиционно мы ожидаем, что сопоставление «многие ко многим» даст новую таблицу для сопоставления таблиц FK. Но есть способы изменить это и добавить больше полей / столбцов в эту объединенную таблицу.

Эта объединенная таблица может содержать PK или некоторые дополнительные поля без PK. Смотрите этот блог для точной реализации Смотрите здесь

И в соответствии с вашим примером вам понадобится дополнительный PK в таблице, чтобы вы объявили новую таблицу ParentChildren и объявили свой первичный ключ как linkId. Я показываю только аннотированный класс parentchildren, так как на аннотации для сопоставления «многие ко многим» в родительском и дочернем классах можно ссылаться из поста выше.

@Entity
@Table(name = "parent_children")
public class ParentChildren{
    @Id @GeneratedValue
    private long linkId;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "parent_id") 
    private Parent parent;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "children_id) 
    private Children children;

    // additional fields if you want
    private boolean activated;

    //getters and setters
    }
}

Таким образом, будет создана таблица сопоставления, в которой linkId является первичным ключом, а parent_id и children_id - внешним ключом Просто поймите, почему вы хотите отдельно указать link_id в качестве первичного ключа и как вы собираетесь его использовать.

0 голосов
/ 23 декабря 2008

Я не уверен, что вы можете легко осуществить это для существующей базы данных с существующими данными. Hibernate обычно лучше определить собственную схему данных при первом подключении ...

Я выполнил аннотации «многие ко многим», но я думаю, что документация hibernate предлагает примеры на основе XML: текст ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...