어떤 경우에 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;
}
}
그러면 다음과 같은 데이터베이스 구조가 생성됩니다.
그@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;
결과 데이터베이스는 다음과 같습니다.
마지막으로, 다대다 어소시에이션의 스키마를 작성하는 경우는, 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_tag
를 Tag
: " "를 엔티티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 매핑은 다대다 어소시에이션처럼 동작합니다.
테이블을 , 「」를 도 있습니다.@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_comment
table.syslog를 클릭합니다.
★★★
@OneToMany
이지 않기 으로 하는 이 좋습니다.@OneToMany
또는 「어소시에이션」의 어느쪽인가.@ManyToOne
sideside.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
'source' 카테고리의 다른 글
디렉토리의 모든 파일 삭제(디렉토리 제외) - 1개의 라이너 솔루션 (0) | 2022.08.21 |
---|---|
상위 컴포넌트에서 Vue.js 기능 컴포넌트에 클래스를 적용하는 방법 (0) | 2022.08.21 |
Vuex v-model을 개체 상태 필드로 (0) | 2022.08.21 |
vuejs 어플리케이션 내에서 외부 cdn에서 로드된 bing 맵을 사용하려면 어떻게 해야 합니까? (0) | 2022.08.20 |
VueJS 구성 요소에서 getElementById를 사용하는 모듈을 가져오는 중 (0) | 2022.08.20 |