[JPA] @ElementCollection 사용 예

RDB(Relational DataBase) 에는 Collection 형태의 데이터를 칼럼에 저장할 수 있는 방법이 없습니다. 그래서 별도의 테이블을 생성하고 Collection을 관리해야 합니다.

JPA의 @ElementCollection 사용하여 별도의 테이블을 생성하고 Collection 을 관리할 수 있습니다.

ElementCollection 특징은 부모 Entity에 의해 관리되고, 항상 부모와 함께 저장되고 삭제됩니다. casecade 옵션이 default입니다.

Collection 대상이 되는 객체는 @Entity 가 아닌 Embeddable Class로 생성하여 One-To-Many 관계를 맺습니다.

1
2
3
4
5
6
7
8
9
10
@Embeddable
@Data
public class Address {

@Column(length = 50)
public String address;

@Column(length = 50)
public String detailAddress;
}

@ElementCollection 생성하여 Collection 테이블을 생성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Entity
@Data
public class User {

@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(
name = "user_address",
joinColumns = @JoinColumn(name = "userId")
)
@ForeignKey(name = "fk_user_address")
private List<Address> addresses;

...
}

결과

다음과 같은 DDL 스크립트가 만들어집니다.

1
2
3
4
5
6
7
CREATE TABLE `user_address` (
`user_id` int(11) NOT NULL,
`address` varchar(50) DEFAULT NULL,
`detail_address` varchar(50) DEFAULT NULL,
KEY `fk_user_address` (`user_id`),
CONSTRAINT `fk_user_address` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

참고

Share