Life Developer
인생 개발자
[JPA]테이블에 컬렉션을 저장한다-@ElementCollection,@CollectionTable

웬만하면 다 Entity 객체 타입이다.

 

값타입 컬렉션은 진짜 정말 단순한거 저장하거나 할때 사용. 추적 필요없을때 사용하는거임.

 

값타입은 식별자가 없어서 엔티티에 의존한다.

 

공유되더라도 불변객체로 만드는게 안전하다.

 

정말 값타입이라 판단될때 사용하자.

 

Entity로 만들어서 사용하는것을 권장한다.

 

 

 

 

 

FK가진놈이 주인이라고 생각하고 Entity연관관계매핑을 해왔는데 그것과 헷갈린다.

 

자동으로 테이블을 생성해준다.

@ElementCollection을 써주고 @CollectionTable에 테이블 정보를 입력하면 된다.

아 ㅡㅡ 머리 빠개지네

 

 

@ElementCollection
@CollectionTable(name = "FAVORITE_FOOD",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<>();

 

 

 

 

중요한것은 값타입 이기 때문에 member만 persist 해도 전부 쿼리 때려버린다.

 

Member member = new Member();
member.setUserName("member1");
member.setHomeAddress(new Address("homecity", "street", "12312"));

member.getFavoriteFoods().add("치킨");
member.getFavoriteFoods().add("스파게티");
member.getFavoriteFoods().add("족발");

member.getAddressHistory().add(new Address("old1", "street", "12312"));
member.getAddressHistory().add(new Address("old2", "street", "12312"));

em.persist(member);

System.out.println(" ================================== ");

 

 

 

 

========================================================================

 

그럼 이 컬렉션들은 지연로딩일까??

그렇다.

 

아래코드를 실행하면 일단 member만 select 때리고, address와 food 관련 정보를 건드리면 select가 나간다.ㅋ

LAZY가 기억이 나는군.

 

Member member = new Member();
member.setUserName("member1");
member.setHomeAddress(new Address("homecity", "street", "12312"));

member.getFavoriteFoods().add("치킨");
member.getFavoriteFoods().add("스파게티");
member.getFavoriteFoods().add("족발");

member.getAddressHistory().add(new Address("old1", "street", "12312"));
member.getAddressHistory().add(new Address("old2", "street", "12312"));

em.persist(member);

em.flush();
em.clear();

System.out.println(" =========================START============================= ");
Member findMember = em.find(Member.class, member.getId());

List<Address> addressHistory = findMember.getAddressHistory();
for (Address address : addressHistory) {
System.out.println("address.getCity() = " + address.getCity());
}

Set<String> favoriteFoods = findMember.getFavoriteFoods();
for (String favoriteFood : favoriteFoods) {
System.out.println("favoriteFood= " + favoriteFood);
}

System.out.println(" ======================================================= ");
tx.commit(); //이시점에 DB 쿼리가 날라감

 

보니까 LAZY군

 

'Developer' 카테고리의 다른 글

[JPA]Criteria  (0) 2020.09.21
[JPA]JPQL  (0) 2020.09.21
[JPA]@Embeddable 문제점  (0) 2020.09.20
[JPA]공통된거 묶기-@Embedded, @Embeddable  (0) 2020.09.20
[JPA]불쌍한 고아객체..  (0) 2020.09.20
  Comments,     Trackbacks