엔티티 타입
@Entity로 정의하는 객체값 타입
자바 기본 타입(int, double)
래퍼 클래스(Integer, Long)
String
임베디드 타입 사용법
@Embeddable : 값 타입을 정의하는 곳에 표시@Embedded : 값 타입을 사용하는 곳에 표시@Embeddable
public class Period{
private LocalDateTime startDate;
private LocalDateTime endDate;
public Period(){
}
...
}
@Embeddable
public class Address{
private String ciry;
private String street;
priavte String zipcode;
public Address(){
}
...
}
@Entity
public class Member{
...
@Embedded
private Period workPeriod;
@Embedded
private Address homeAddress;
}

장점
값 타입 공유 참조
Address address=new Address("city","street","10000");
Member member1=new Member();
member.setUsername("member1");
member.setHomeAddress(address);
em.persist(member1);
Member member2=new Member();
member.setUsername("member2");
member.setHomeAddress(address);
em.persist(member2);
member1.getHomeAddress().setCity("newCity");
// member2의 값도 바뀜 > side effect (부작용) 발생
값 타입 복사
Address address=new Address("city","street","10000");
Member member1=new Member();
member.setUsername("member1");
member.setHomeAddress(address);
em.persist(member1);
Address copyAddress
=new Address(address.getCity(),address.getStreet(),address.getZipcode());
Member member2=new Member();
member.setUsername("member2");
member.setHomeAddress(copyAddress);
em.persist(member2);
member1.getHomeAddress().setCity("newCity");
객체 타입의 한계
Address address=new Address("city","street","10000");
Member member1=new Member();
member.setUsername("member1");
member.setHomeAddress(address);
em.persist(member1);
Address newAddress=new Address("NewCity", address.getStreet(), address.getZipcode());
member.setHomeAddress(newAddress);
@ElementCollection, @CollectionTable 사용
@Entity
public class Member{
...
@ElementCollection
@CollectionTable(name = "FAVORITE_FOOD",
joinColumns = @JoinColumn(name = "MEMBER_ID" ) //외래키 설정)
@Column(name = "FOOD_NAME")
// 값이 String 하나여서 저쪽 테이블을 생성할 때 컬럼명을 해당 명으로 생성해줌
private Set<String> favoriteFoods=new HashSet<>();
@ElementCollection
@CollectionTable(name = "ADDRESS",
joinColumns = @JoinColumn(name = "MEMBER_ID" ))
private List<Address> addresssHistory=new ArrayList<>();
...
}
값 타입 수정
findMember.getFavoriteFoods().remove("치킨");
findMember.getFavoriteFood().add("한식");
findMember.getAddressHistory().remove(new Address("old1","street","10000"));
// 값을 비교할 때 equals()로 비교 > equals 메서드가 적절하게 구현되어 있어야 함
findMember.getAddressHistory().add(new Address("newCity1","street","10000"));
값 타입 컬렉션의 제약사항
엔티티 생성
@Entity
public class Member{
...
@OneToMany(cascade= CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name="MEMBER_ID")
private List<AddressEntity> addressHistory=new ArrayList<>();
...
}
@Entity
@Table(name="ADDRESS")
public class AddressEntity{
@Id @GeneratedValue
private Long id;
private Address address;
public AddressEntity(String city, String street, String zipcode){
this.address=new Address(city,street,zipcode);
}
...
}
//저장
member.getAddressHistory().add(new AddressEntity("old1","street","10000"));
member.getAddressHistory().add(new AddressEntity("old2","street","10000"));