👀 PK값
- "Primary Key(기본 키)"
- 각 레코드를 고유하게 식별하는 데 사용되는 필드(열) ex. 사용자 고유의 ID
Order 엔티티
를 생성할 때 함께 OrderDate 객체
도 생성되며, Order 엔티티가 삭제될 때 OrderDate 객체도 함께 삭제임베디드 타입
으로 만들어 주고 사용
- Period : 회원 정보 중 startDate, endDate를 묶은 것
- Address : 회원 정보 중 city, street, zipcode를 묶은 것
- 이런 묶음을
임베디드 타입
이라고 함
@Embeddable
@Embedded
@Embeddable
과 @Embedded
둘 중에 하나만 넣어도 되지만 둘 다 넣는 것을 권장💡 예시
@Embeddable
@Embeddable
@Getter @Setter
public class Address {
private String city;
private String street;
private String zipcode;
public Address(String city, String street, String zipcode) {
super();
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
// 기본생성자는 반드시 있어야 한다.
public Address() { }
}
@Embedded
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "name", nullable = false)
private String username;
@Embedded
private Address address;
}
try {
Member member = new Member();
member.setUsername("user");
member.setAddress(new Address("서울", "역삼", "123"));
}
@AttributeOverrides
, @AttributeOverride
어노테이션 사용💡 예시
// 집주소
@Embedded
private Address address;
// 회사 주소
@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;
💡 하나의 객체 타입 값을 2객체에 할당
Address addr = new Address("서울", "역삼", "123");
Member member = new Member();
member.setUsername("user1");
member.setAddress(addr);
em.persist(member);
Member member2 = new Member();
member2.setUsername("user2");
member2.setAddress(addr);
em.persist(member2);
tx.commit();
💡 그 중 한 객체의 값 변경
member.getAddress().setCity("newCity");
👍 결과 🚫 오류 user1, user2의 city값이 다 바뀜 🚫
이유
int a = 10;
int b = a
객체 공유 : 클래스 공유
- 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본타입이 아니라 객체 타입
- 자바 기본 타입에 값을 대입하면 값을 복사한다.
- 객체 타입은 참조 값을 직접 대입하는 것을 막을 방법이 없음
- 항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 피할 수 있음
💡 기본값타입들을 복사해서 넘겨주는 방식
Address addr = new Address("서울", "역삼", "123");
// 새로운 객체 생성
Address copyAddr = new Address(addr.getCity(), addr.getStreet(), addr.getZipcode());
Member member = new Member();
member.setUsername("user1");
member.setAddress(addr);
em.persist(member);
Member member2 = new Member();
member2.setUsername("user2");
// 새로운 객체 할당
member2.setAddress(copyAddr);
em.persist(member2);
// 1번째 member 주소만 바꾸고 싶어
member.getAddress().setCity("newCity");
tx.commit();