@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
private int age;
}
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
private int age;
// 주소를 표현
private String city;
private String street;
private String zipcode;
// 근무기간을 표현
private LocalDateTime startDate;
private LocalDateTime endDate;
}
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
private int age;
// 집 주소를 표현
private String homeCity;
private String homeStreet;
private String homeZipcode;
// 회사 주소를 표현
private String companyCity;
private String companyStreet;
private String companyZipcode;
// 근무기간을 표현
private LocalDateTime startDate;
private LocalDateTime endDate;
}
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
private int age;
// 집 주소를 표현
@Embedded
private Address homeAddress;
// 회사 주소를 표현
@Embedded
private Address companyAddress;
// 근무기간을 표현
@Embedded
private Period workPeriod;
}
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
}
@Embeddable
public class Period {
private LocalDateTime startDate;
private LocalDateTime endDate;
public boolean isWork() {
return ...
}
}
@Entity
public class Member {
@Embedded Address address; // 임베디드 타입
@Embedded PhoneNumber phoneNumber; // 임베디드 타입
}
@Embeddable
public class Address {
private String city;
private String street;
@Embedded private Zipcode zipcode; // 임베디드 타입
}
@Embeddable
public class Zipcode {
private String zip;
private String plusFour;
}
@Embeddable
public class PhoneNumber {
private String areaCode;
private String localNumber;
@ManyToOne PhoneServiceProvider provider: // 엔티티 참조
}
@Entity
public class PhoneServiceProvider {
@Id
private String name;
}
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
private int age;
// 집 주소를 표현
@Embedded
private Address homeAddress;
// 회사 주소를 표현
@Embedded
@AttributeOverrides({
@AttributeOverride(name="city", column=@Columnn(name = "COMPANY_CTIY")),
@AttributeOverride(name="street", column=@Columnn(name = "COMPANY_STREET")),
@AttributeOverride(name="zipcode", column=@Columnn(name = "COMPANY_ZIPCODE"))
})
private Address companyAddress;
// 근무기간을 표현
@Embedded
private Period workPeriod;
}
Address a = new Address("Old");
Address b = a.clone(); // 항상 복사를 통해 전달
@Embeddable
public class Address {
private String city;
protected Address() {}
public Address(String city) {
this.city = city;
}
public String getCity() {
return city;
}
// setter 절대 생성 금지!
}
Address a = new Address("Old");
// 생성자를 통해 새로운 객체 생성
Address b = new Address(a.getCity());
💡 Integer, String 자바가 제공하는 대표적인 불변 객체다!
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Embedded
private Address address;
@ElementCollection
@CollectionTable(name = "FAVORITE_FOODS", joinColumns = @JoinColumn(name = "MEMBER_ID"))
@Column(name = "FOOD_NAME") // 컬럼이 하나인 경우 컬럼명 지정 가능
private Set<String> favoriteFoods = new HashSet<>();
@ElementCollection
@CollectionTable(name = "ADDRESS", joinColumns = @JoinColumn(name = "MEMBER_ID"))
private Set<String> addressHistory = new HashSet<>();
}
// 기본값 타입 컬렉션 (String)
member.getFavoriteFoods().add("치킨");
member.getFavoriteFoods().add("피자");
// 임베디드 값 타입 컬렉션 (Address)
member.getAddressHistory().add(new Address("newAddress"));
// 영속화
em.persist(member);
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "member_id")
private List<Address> addressHistory = new ArrayList<>();
💡 이 글은 자바 ORM 표준 JPA 프로그래밍(김영한) 책을 바탕으로 작성되었습니다.