4 ответов:
редактировать 2017-04-29: как указывают некоторые комментаторы, самые
JoinTableпример не нуженmappedByатрибут аннотации. Фактически, последние версии Hibernate отказываются запускаться, печатая следующую ошибку:org.hibernate.AnnotationException: Associations marked as mappedBy must not define database mappings like @JoinTable or @JoinColumn
давайте представим, что у вас есть сущность с именем
Projectи еще одна сущность с именемTaskи каждый проект может иметь много задач.вы можете создать схему базы данных для этого сценария в двух вариантах пути.
первое решение-создать таблицу с именем
Projectи еще одна таблица с именемTaskи добавьте столбец внешнего ключа в таблицу задач с именемproject_id:Project Task ------- ---- id id name name project_idтаким образом, можно будет определить проект для каждой строки в таблице задач. Если вы используете этот подход, в ваших классах сущностей вам не понадобится объединенная таблица:
@Entity public class Project { @OneToMany(mappedBy = "project") private Collection<Task> tasks; } @Entity public class Task { @ManyToOne private Project project; }другое решение-использовать третью таблицу, например,
Project_Tasks, и хранить отношения между проекты и задачи в этой таблице:Project Task Project_Tasks ------- ---- ------------- id id project_id name name task_idThe
Project_Tasksтаблица называется "таблица". Для реализации этого второго решения в JPA вам нужно использовать@JoinTableПримечание. Например, чтобы реализовать однонаправленную ассоциацию "один ко многим", мы можем определить наши сущности как таковые:
Projectсущности:@Entity public class Project { @Id @GeneratedValue private Long pid; private String name; @JoinTable @OneToMany private List<Task> tasks; public Long getPid() { return pid; } public void setPid(Long pid) { this.pid = pid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Task> getTasks() { return tasks; } public void setTasks(List<Task> tasks) { this.tasks = tasks; } }
Taskсущности:@Entity public class Task { @Id @GeneratedValue private Long tid; private String name; public Long getTid() { return tid; } public void setTid(Long tid) { this.tid = tid; } public String getName() { return name; } public void setName(String name) { this.name = name; } }это создаст следующую базу данных структура:
The
@JoinTableаннотация также позволяет настраивать различные аспекты таблицы соединений. Например, если бы мы аннотировалиtasksвот так:@JoinTable( name = "MY_JT", joinColumns = @JoinColumn( name = "PROJ_ID", referencedColumnName = "PID" ), inverseJoinColumns = @JoinColumn( name = "TASK_ID", referencedColumnName = "TID" ) ) @OneToMany private List<Task> tasks;результирующая база данных стала бы:
наконец, если вы хотите создать схему для связи "многие ко многим", использование таблицы соединений является единственным доступным решением.
Это единственное решение для отображения Ассоциации ManyToMany: вам нужна таблица соединения между таблицами to entities для отображения ассоциации.
Он также используется для OneToMany (обычно однонаправленных) ассоциаций, когда вы не хотите добавлять внешний ключ в таблицу многих сторон и, таким образом, сохранять его независимым от одной стороны.
Поиск @JoinTable в hibernate documentation для объяснений и примеров.
Это также чище использовать
@JoinTableкогда сущность может быть дочерним в нескольких родительских / дочерних отношениях с разными типами родителя. чтобы следовать примеру Бехранга, представьте, что задача может быть дочерним элементом проекта, человека, отдела, исследования и процесса.должны
taskтаблица 5nullableполя внешнего ключа? Думаю, что нет...
Это позволяет обрабатывать многие ко многим отношения. Пример:
Table 1: post post has following columns ____________________ | ID | DATE | |_________|_________| | | | |_________|_________| Table 2: user user has the following columns: ____________________ | ID |NAME | |_________|_________| | | | |_________|_________|Join Table позволяет создать отображение с помощью:
@JoinTable( name="USER_POST", joinColumns=@JoinColumn(name="USER_ID", referencedColumnName="ID"), inverseJoinColumns=@JoinColumn(name="POST_ID", referencedColumnName="ID"))создадим таблицу:
____________________ | USER_ID| POST_ID | |_________|_________| | | | |_________|_________|


Comments