beadss / jpa-study

jpa슽터디입니다
1 stars 2 forks source link

9장 정리 #28

Open 2xel opened 5 years ago

2xel commented 5 years ago

9. 값 타입

1. 기본값 타입

@Entity
class Member{
    @Id
    private Long id;

    private String name;
    private int age;
}

2. 임베디드 타입(복합 값 타입)

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;

    @Embedded Period workPeriod;    // 근무기간
    @Embedded Address homeAddress;  // 집주소
    ...
}

// 근무기간 임베디드 타입
@Embeddable
public class Period {
    @Temporal(TemporalType.DATE) Date startDate;
    @Temporal(TemporalType.DATE) Date endDate;
    ...
    public boolean isWork(Date date) {
        // 값 타입을 위한 메소드 정의
    }
}

// 집주소 임베디드 타입
@Embeddable
public class Address {
    @Column(name="city")    // 매핑할 컬럼 정의 가능
    private String city;
    private String street;
    private String zipcode;
}

2.1 임베디드 타입과 테이블 매핑

2.2 임베디드 타입과 연관관계

2.3 @AttirubteOverride: 속성 재정의

// 같은 임베디드 타입을 하나더 가지고 있는 회원
@Entity
public class Member {
    ...
    @Embedded Address homeAddress;
    @Embedded Address companyAddress;
}

// 임베디드 타입 재정의
@Entity
public class Member {
    ...
    @Embedded Address homeAddress;

    @Embedded
    @AttributeOverrides({
        @AttributeOverride(name="city", column=@Column(name="COMPANY_CITY")),
        @AttributeOverride(name="street", column=@Column(name="COMPANY_STREET")),
        @AttributeOverride(name="zipcode", column=@Column(name="COMPANY_ZIPCODE"))
    })
    Address companyAddress;
}
CREATE MEMBER (
    ...
    city varchar(255),
    street varchar(255),
    zipcode varchar(255),
    COMPANY_CITY varchar(255),
    COMPANY_STREET varchar(255),
    COMPANY_ZIPCODE varchar(255),
    ...
)

2.4 임베디드 타입과 null

3. 값 타입과 불변 객체

3.1 값 타입 공유 참조

member1.setHomeAddress(new Address("oldCIty"));
Address address = member1.getHomeAddress();

address.setCity("newCity");
member2.setHomeAddress(address);

3.2 값 타입 복사

3.3 불변 객체

4. 값 타입의 비교

5. 값 타입 컬렉션

@Entity
public class Member {
    ...
    @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 List<Address> addressHistory = new ArrayList<>();
    ...
}

@Embeddable
public class Address {
    @Column
    private String city;
    private String street;
    private String zipcode;
    ...
}

5.1 값 타입 컬렉션 사용

Member member = new Member();

member.setHomeAddress(new Address("판교", "알파돔타워", "123-456"));

member.setFavoriteFoods().add("커리");
member.setFavoriteFoods().add("짜장");
member.setFavoriteFoods().add("짬뽕");

member.getAddressHistory().add(new Address("서울","강남","123-123"));
member.getAddressHistory().add(new Address("서울","강북","321-321"));

em.persist(member);
INSERT INTO MEMBER (ID, CITY, STREET, ZIPCODE) VALUES (1, "판교", "알파돔타워", "123-456")
INSERT INTO FAVORITE_FOODS (MEMBER_ID, FOOD_NAME) VALUES (1, "커리")
INSERT INTO FAVORITE_FOODS (MEMBER_ID, FOOD_NAME) VALUES (1, "짜장")
INSERT INTO FAVORITE_FOODS (MEMBER_ID, FOOD_NAME) VALUES (1, "짬뽕")
INSERT INTO ADDRESS (MEMBER_ID, CITY, STREET, ZIPCODE) VALUES (1, "서울", "강남", "123-123")
INSERT INTO ADDRESS (MEMBER_ID, CITY, STREET, ZIPCODE) VALUES (1, "서울", "강북", "321-321")
Member member = em.find(Member.class, 1L);

Address homeAddress = member.getHomeAddress();

Set<String> favoriteFoods = member.getFavoriteFoods();

for(String favoriteFood : favoriteFoods) {
    System.out.println("favoriteFood :" + favoriteFood);
}

List<Address> addressHistory = member.getAddressHistory();

addressHistory.get(0);

5.2 값 타입 컬렉션의 제약사항