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;
|
참고