source

어떤 경우에 JPA @JoinTable 주석을 사용합니까?

factcode 2022. 8. 21. 14:05
반응형

어떤 경우에 JPA @JoinTable 주석을 사용합니까?

이 경우 JPA를 사용합니까?@JoinTable주석?

2017-04-29 편집: 일부 논객들이 지적한 와 같이JoinTable예시는 필요 없습니다.mappedBy주석 속성.실제로, 최신 버전의 휴지 상태에서는, 다음의 에러를 인쇄해 기동을 거부합니다.

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

Project_Tasks테이블을 "접속 테이블"이라고 합니다.이 두 번째 솔루션을 JPA에 구현하려면@JoinTable주석입니다.예를 들어, 1 대 다의 단방향 어소시에이션을 실장하기 위해서, 다음과 같이 엔티티를 정의할 수 있습니다.

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 그림 1

@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 그림 2

마지막으로, 다대다 어소시에이션의 스키마를 작성하는 경우는, Join 테이블을 사용하는 것만이 유일한 솔루션입니다.

이 솔루션은 ManyToMany 연결을 매핑하는 유일한 솔루션입니다. 연결을 매핑하려면 두 엔티티 테이블 사이에 조인 테이블이 필요합니다.

또한 여러 개의 테이블에 외부 키를 추가하지 않고 한 쪽과 독립적으로 유지하려는 경우 OneToMany(일반적으로 단방향) 연결에도 사용됩니다.

설명과 예는 휴지 상태의 문서에서 @JoinTable을 검색합니다.

사용법도 깔끔합니다.@JoinTable서로 다른 유형의 부모와의 여러 부모/자녀 관계에서 기업이 자녀일 수 있는 경우.Behrang의 예를 따라 후속 작업을 프로젝트, 사람, 부서, 스터디 및 프로세스의 하위 항목으로 가정합니다.

경우,task에는 5가 .nullable부부 키??★★★★★★★★★★★★★★★...

@ManyToMany

하면 대부분 '어울릴 때', '어울 때', '어울 때', ' 때론 '어울 때'를 사용합니다.@JoinTable주석: 다대다 테이블 관계의 매핑을 지정합니다.

  • 링크 테이블의 이름 및
  • 두 개의 외부 키 열

따라서 다음과 같은 데이터베이스 테이블이 있다고 가정합니다.

다대다 테이블 관계

서서 Post엔티티는 다음과 같이 이 관계를 매핑합니다.

@ManyToMany(cascade = {
    CascadeType.PERSIST,
    CascadeType.MERGE
})
@JoinTable(
    name = "post_tag",
    joinColumns = @JoinColumn(name = "post_id"),
    inverseJoinColumns = @JoinColumn(name = "tag_id")
)
private List<Tag> tags = new ArrayList<>();

@JoinTable은 테이블 할 때 합니다.name Foreign Key ](키를 참조하는 [Foreign ](외부 키)합니다.럼을 참조합니다.post 이이:joinColumns Foreign Key ]의 [합니다.【외부 키】럼의post_tagTag: " "를 엔티티inverseJoinColumns여하하다

「」의 해 주세요.@ManyToMany은 '주석'으로 되어 있습니다.PERSIST ★★★★★★★★★★★★★★★★★」MERGE '''가 원인일 입니다.REMOVE쪽는 DELETE 스테이트먼트가 않습니다.tag'우리'가 '우리'가post_tag★★★★★★ 。

★★★@OneToMany

" " "@OneToMany 「」이 어소시에이션@JoinColumn매핑, 1대 다가 아닌 다대 다 테이블 관계처럼 동작합니다.

따라서 다음과 같은 엔티티 매핑이 있다고 가정합니다.

@Entity(name = "Post")
@Table(name = "post")
public class Post {
 
    @Id
    @GeneratedValue
    private Long id;
 
    private String title;
 
    @OneToMany(
        cascade = CascadeType.ALL,
        orphanRemoval = true
    )
    private List<PostComment> comments = new ArrayList<>();
 
    //Constructors, getters and setters removed for brevity
}
 
@Entity(name = "PostComment")
@Table(name = "post_comment")
public class PostComment {
 
    @Id
    @GeneratedValue
    private Long id;
 
    private String review;
 
    //Constructors, getters and setters removed for brevity
}

휴지 상태는 위의 엔티티 매핑에 대해 다음 데이터베이스 스키마를 가정합니다.

단방향 @OneToMany JPA 연결 데이터베이스 테이블

한 바와 같이 @OneToManyJPA 매핑은 다대다 어소시에이션처럼 동작합니다.

테이블을 , 「」를 도 있습니다.@JoinTable★★★★

@OneToMany(
    cascade = CascadeType.ALL,
    orphanRemoval = true
)
@JoinTable(
    name = "post_comment_ref",
    joinColumns = @JoinColumn(name = "post_id"),
    inverseJoinColumns = @JoinColumn(name = "post_comment_id")
)
private List<PostComment> comments = new ArrayList<>();

이제 을 '링크테이블'이라고 부르겠습니다.post_comment_ref[ 키( Key)]은 [외부 키(Foreign Key)]가.컬럼은post_id의는, 「」의 경우post및 " " " 입니다.post_comment_id의는, 「」의 경우post_commenttable.syslog를 클릭합니다.

★★★@OneToMany이지 않기 으로 하는 이 좋습니다.@OneToMany 또는 「어소시에이션」의 어느쪽인가.@ManyToOnesideside.displaces를 합니다.

다대다 관계를 처리할 수 있습니다.예:

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 |
|_________|_________|
|         |         |
|_________|_________|

언급URL : https://stackoverflow.com/questions/5478328/in-which-case-do-you-use-the-jpa-jointable-annotation

반응형