반응형
@Entity
public class Account {
@Id @GeneratedValue
private Long id;
private String name;
private String street;
private String city;
private String state;
private String zipCode;
}
이렇게 Account 라는 객체가 있다고 할 때, street, city, state, zipCode는 서로 관련된 개념이다. 그리고 name 과는 관련이 없는 값들이다. JPA에서는 이를 하나로 묶어서 표현할 수 있다.
@Embeddable
public class Address {
private String street;
private String city;
private String state;
private String zipCode;
}
우선 @Embeddable 어노테이션을 달고, 연관된 필드들과 함께 적절한 객체명을 지어준다.
@Entity
public class Account {
@Id @GeneratedValue
private Long id;
private String name;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "street", column = @Column(name = "home_street"))
})
private Address address;
}
그리고 @Embedded 어노테이션을 달아서 묶어줄 수 있다. 실제로 생성된 테이블은 첫 번째 Account 필드와 같게 된다.
하지만 특정 필드의 칼럼의 속성을 바꿔줄 수도 있는데, 이는 @AttribueOverride (여러 개를 선택해야할 떄는 -s 로 함) 어노테이션을 통해 수정해줄 수 있다.
임베디드 타입의 경우 수정을 할 수 있도록 하면 위험해지는데, Address 객체를 생성 후 Account1 객체에 넣어준 뒤, Address 객체를 수정 후 Account2 객체에 넣으면 Account1까지 수정이 될 수 있기 때문이다.
따라서 이를 원천적으로 막도록 하는 것이 중요한데, 이는 모든 필드값을 수정하는 메서드는 금지하고, JPA에 필수적인 기본 생성자는 protected로, 모든 필드값을 받는 생성자를 두어 만들게 해둔다.
반응형
'TIL ✍️' 카테고리의 다른 글
23년 12월 18일(월요일) - 54번째 TIL : QueryDSL (0) | 2023.12.18 |
---|---|
23년 12월 15일(금요일) - 53번째 TIL (0) | 2023.12.15 |
23년 12월 13일(수요일) - 51번째 TIL (1) | 2023.12.13 |
23년 12월 12일(화요일) - 50번째 TIL : 정규 표현식 Positive lookahead (0) | 2023.12.12 |
23년 12월 8일(금요일) - 48번째 TIL : intellij file encoding change (0) | 2023.12.08 |