코드 그라데이션
실전 예제 6. 값 타입 매핑 본문
참고
equals() and hashcode() 구현 시
"Use getters during code generation" 옵션 사용하세요.
이 옵션을 선택하면 getter를 호출한다.
이걸 선택하지 않으면 필드에 직접 접근함.
필드에 직접 접근하면 문제 발생
무엇이?
Proxy일 때, 계산이 안 된다.
그래서 JPA에서는 메서드를 통해서 값을 호출하도록 코드를 구현하는게 좋다.
그게 안전하다.
예제 6. 값 타입 매핑 구조도
1. Address 테이블 생성
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
public String getCity() {
return city;
}
public String getStreet() {
return street;
}
public String getZipcode() {
return zipcode;
}
// setter는 일부러 다 막았다.
private void setCity(String city) {
this.city = city;
}
private void setStreet(String street) {
this.street = street;
}
private void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
// equals and hashcode 구현
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Address address = (Address) o;
return Objects.equals(getCity(), address.getCity()) && Objects.equals(
getStreet(), address.getStreet()) && Objects.equals(getZipcode(),
address.getZipcode());
}
@Override
public int hashCode() {
return Objects.hash(getCity(), getStreet(), getZipcode());
}
}
2. Member 테이블 수정
@Entity
public class Member extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "MEMBER_ID")
private Long id;
private String name;
// private String city;
// private String street;
// private String zipcode;
@Embedded
private Address address;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
}
3. Delivery 테이블 수정
@Entity
@NoArgsConstructor
public class Delivery extends BaseEntity {
@Id
@GeneratedValue
private Long id;
// private String city;
// private String street;
// private String zipcode;
@Embedded
private Address address;
private DeliveryStatus status;
@OneToOne(mappedBy = "delivery", fetch = LAZY)
private Order order;
}
실행해보면
똑같이 값 잘 들어가서 생성된다.
수업 막판에 값 타입의 장점으로 해서 좀 더 추가한 부분
- 의미있는 메서드 구현해서 활용, validation check 등.
Address
@Column(length = 10)
private String city;
@Column(length = 20)
private String street;
@Column(length = 5)
private String zipcode;
public String fullAddress() {
return getCity() + " " + getStreet() + " " + getZipcode();
}
다시 실행한 거 보면
제약조건이 잘 적용되어 있음.
728x90
'Spring > JPA 공부' 카테고리의 다른 글
ORM에 대한 궁금증과 오해 (3) | 2024.03.16 |
---|---|
JPQL - 기본 문법과 기능 (0) | 2023.08.29 |
값 타입 컬렉션 (0) | 2023.08.27 |
값 타입의 비교 (0) | 2023.08.27 |
값 타입과 불변 객체 (0) | 2023.08.26 |
Comments