JPA" @JoinTable " аннотация



в этом случае вы используете JPA @JoinTable аннотации?

1091   4  

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_id

The 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;
    }

}

это создаст следующую базу данных структура:

ER Diagram 1

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;

результирующая база данных стала бы:

ER Diagram 2

наконец, если вы хотите создать схему для связи "многие ко многим", использование таблицы соединений является единственным доступным решением.

Это единственное решение для отображения Ассоциации ManyToMany: вам нужна таблица соединения между таблицами to entities для отображения ассоциации.

Он также используется для OneToMany (обычно однонаправленных) ассоциаций, когда вы не хотите добавлять внешний ключ в таблицу многих сторон и, таким образом, сохранять его независимым от одной стороны.

Поиск @JoinTable в hibernate documentation для объяснений и примеров.

Это также чище использовать @JoinTable когда сущность может быть дочерним в нескольких родительских / дочерних отношениях с разными типами родителя. чтобы следовать примеру Бехранга, представьте, что задача может быть дочерним элементом проекта, человека, отдела, исследования и процесса.

должны task таблица 5 nullable поля внешнего ключа? Думаю, что нет...

Это позволяет обрабатывать многие ко многим отношения. Пример:

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

    Ничего не найдено.