728x90
이런 테이블들이 있다고 해보자.
job | |
id | VARCHAR(10) |
name | VARCHAR(100) |
job_perm | |
job_id | VARCHAR(10) |
permission | VARCHAR(20) |

이렇게 job 안에 permission에 해당 하는 값들을 보관하고 있어야 한다.
import jakarta.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "job")
public class job {
@Id
private String id;
private String name;
@ElementCollection
@CollectionTable(
name="job_perm", //job_perm 테이블 명
joinColumns = @JoinColumn(name = "job_id") //job_perm 테이블의 job_id column
)
@Column(name = "perm") //job_perm 테이블의 permission column
private Set<String> permissions = new HashSet<>();
protected job() {}
public job(String id, String name, Set<String> permissions) {
this.id = id;
this.name = name;
this.permissions = permissions;
}
//getter... setter...
public Set<String> getPermissions() {
return permissions;
}
public void setPermissions(Set<String> permissions) {
this.permissions = permissions;
}
}
이렇게 내부에 Set을 만들고 @ElementCollection을 작성해준다.
한 번에 이해하기 힘들테니 바로 실행을 해보고 결과를 확인해보자.
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Persistence;
import java.util.Set;
public class roleMain{
public static void main(String[] args) {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpabegin");
EntityManager entityManager = entityManagerFactory.createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
try{
entityTransaction.begin();
job job1 = new job("1", "안녕", Set.of("11", "22"));
entityManager.persist(job1);
entityTransaction.commit();
}catch(Exception ignored){
}
try{
job job2 = entityManager.find(job.class, "1");
for(String perm : job2.getPermissions()){
System.out.println(perm);
}
}finally {
entityManager.close();
}
entityManagerFactory.close();
}
}
job을 persist 할 때 Set에 11, 22에 해당하는 값을 입력해주면

이렇게 job 테이블에 데이터 하나가 추가가 되고

job_perm 테이블에는 집합으로 넣었던 데이터 2개가 추가가 된다.
find로 조회할 때는

class에 작성했던 getPermission을 통해 for-each문으로 가져오면 된다.
당연히 Embeddable 타입도 가능하다.

이런 관계에서도 위와 비슷하게 @Embeddable 클래스만 만들어주고 동일 작업을 수행하면 된다.
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
@Embeddable
public class information {
@Column(name = "perm")
private String permission;
private String info;
protected information () {}
public information(String permission, String info) {
this.permission = permission;
this.info = info;
}
//getter... setter
}
import jakarta.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name="role")
public class job2 {
@Id
private String id;
private String name;
@ElementCollection
@CollectionTable(
name="role_perm",
joinColumns = @JoinColumn(name = "role_id")
)
private Set<information> informationSet = new HashSet<>();
protected job2(){}
public job2(String id, String name, Set<information> informationSet) {
this.id = id;
this.name = name;
this.informationSet = informationSet;
}
//getter... setter...
public Set<information> getInformationSet() {
return informationSet;
}
public void setInformationSet(Set<information> informationSet) {
this.informationSet = informationSet;
}
}

이렇게 정상적으로 작동하게 된다.
'백엔드 > JPA' 카테고리의 다른 글
JPA 9장 (Map collection mapping) (0) | 2023.03.21 |
---|---|
JPA 8장 (List collection mapping) (0) | 2023.03.18 |
JPA 6장 (@Embeddable) (0) | 2023.03.17 |
JPA 5장 (Entity 식별자 생성 방식) (0) | 2023.03.16 |
JPA 4장 (Entity에 대하여) (0) | 2023.03.16 |