JPA의 데이터 타입 분류
기본값 타입
참고: 자바의 기본 타입은 절대 공유 X
- int, double 같은 기본 타입(primitive type)은 절대 공유 X
- 기본 타입은 항상 값을 복사함
- Integer같은 래퍼 클래스나 String 같은 특수한 클래스는 공유 가능한 객체이지만 변경 X
임베디드 타입(복합타입)
Member
public class Member{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
@Column(name="USERNAME")
private String name;
@Embedded
private Period workPeriod;
@Embedded
private Address homeAddress;
Period
@Embeddable
public class Period {
private LocalDateTime startDate;
private LocalDateTime endDate;
public Period() {
}
Address
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
public Address() {
}
public class Member{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
@Column(name="USERNAME")
private String name;
@Embedded
private Period workPeriod;
@Embedded
private Address homeAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="city",
column=@Column(name="WORK_CITY")),
@AttributeOverride(name="street",
column=@Column(name="WORK_STREET")),
@AttributeOverride(name="zipcode",
column=@Column(name="WORK_ZIPCODE"))
})
private Address workAddress;
값 타입과 불변객체
값 타입은 복잡한 객체 세상을 조금이라도 단순화하려고 만든 개념이다. 따라서 값 타입은 단순하고 안전하게 다 룰 수 있어야 한다.
Address address = new Address("city", "street", "10000");
Member member = new Member();
member.setName("DD");
member.setHomeAddress(address);
em.persist(member);
Member member2 = new Member();
member2.setName("DD2");
member2.setHomeAddress(address);
em.persist(member2);
member.getHomeAddress().setCity("dd");
이 경우 member2의 city까지 바뀌게 됨
Address address = new Address("city", "street", "10000");
Member member = new Member();
member.setName("DD");
member.setHomeAddress(address);
em.persist(member);
Address copyAddress = new Address(address.getCity(),address.getStreet(), address.getZipcode());
Member member2 = new Member();
member2.setName("DD2");
member2.setHomeAddress(copyAddress);
em.persist(member2);
기본 타입
int a = 10;
int b = 1;
b = 4;
기본 타입은 값을 복사
객체 타입
Address a = new Address("Old");
Address b = a;
b.setCity("New");
객체 타입은 참조를 전달
값 타입의 비교
값 타입 : 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야 함