정의
하는 곳에 표시사용
하는 곳에 표시기본 생성자 필수
엔티티 클래스에서는 Period, Address와 같이 임베디드 타입으로 묶었지만,
DB 테이블에서는 아무런 변화없이, 기본 테이블과 같은 형태로 만들어진다.
Member.java
@Entity @TableGenerator(name = "MEMBER_SEQ_GENERATOR", table="MY_SEQUENCES", pkColumnValue = "MEMBER_SEQ", allocationSize = 1) @Getter @Setter public class Member { @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "MEMBER_SEQ_GENERATOR") private Long id; @Column(name = "name", nullable = false) private String username; private int age; private LocalDateTime startDate; private LocalDateTime endDate; private String city; private String street; private String zipcode;
묶어주기 위해서 클래스 생성하기 - Period / Address
묶을 변수들을 클래스로 옮긴다.
@Embeddable 어노테이션 사용 -> 값 타입을 정의
Member에서는 @Embedded 어노테이션으로 임베디드 타입을 사용한다.
Period 객체를 만들어준다.
@Embedded와 @Embeddable 둘 중 하나만 넣어도 되나, 둘 다 넣어줄 것을 권장
Member에서 Period에 접근할 수 있도록 getter, setter 생성해줘야 한다.
Address 임베디드 타입 생성
-
기본생성자가 필수이기 때문에 생성해주고, 테스트를 위한 파라미터가 있는 생성자도 생성해준다.
JpaMain.java 에서 new로 객체 생성하여 값 할당 -> 객체지향적이다.
-
user1과 user2가 같은 addr을 가지고 있다.
만약 user1의 주소만 newCity로 변경하고 싶어서, member의 Address를 수정했다면, member2의 주소까지 함께 변경된다. 그렇기 때문에 임베디드 타입을 사용할 때는 주의해서 값을 변경해야한다.
같은 객체를 바라보고 있기 때문에, Address 객체를 한 곳에서 수정해도 다른 곳에도 영향을 미치게 된다.
임베디드 타입 객체를 따로 만들고 값만 가져와서 사용하는 방법.
생성자로만 값을 설정
하고 수정자 (Setter)를 만들지 않으면 됨.
한 엔티티에서 같은 값 타입을 사용하면 컬럼명이 중복된다.
@Attributeoverrides, @AttributeOverride를 사용해서 컬럼 명 속성을 재정의
만약 기존의 Address 객체로 회사 주소라는 변수들을 생성한다면, 기존의 Address와 컬럼명이 곂치기 때문에, @attributeOverrides, @AttributeOveride 어노테이션으로 오버라이드 하고, 컬럼명을 변경 해 준다.
//주소 @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;