Member Entity
=====================================================================
@Entity
public class MemberCollection {
@Id
@GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
@Column(name="USERNAME")
private String username;
@Embedded
private Address homeAddress;
@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<>();
....중략...
}
=====================================================================
- 테이블 생성 쿼리
=====================================================================
Hibernate:
create table ADDRESS (
MEMBER_ID bigint not null,
city varchar(255),
street varchar(255),
zipcode varchar(255)
)
Hibernate:
create table FAVORITE_FOOD (
MEMBER_ID bigint not null,
FOOD_NAME varchar(255)
)
=====================================================================
- 테스트 코드 실행
=====================================================================
MemberCollection memberCollection = new MemberCollection();
memberCollection.setUsername("멤버컬렉션테스트");
memberCollection.setHomeAddress(new Address("용인시" , "명지로" , "15999"));
memberCollection.getFavoriteFoods().add("치킨");
memberCollection.getFavoriteFoods().add("피자");
memberCollection.getFavoriteFoods().add("탕수육");
memberCollection.getAddressHistory().add(new Address("용인시","김량장동","10000"));
memberCollection.getAddressHistory().add(new Address("광주시","신현리","20000"));
em.persist(memberCollection);
tx.commit();
=====================================================================
- 테스트 코드 실행 쿼리 , 생성한 Set 과 List 객체만큼 쿼리가 실행됨
=====================================================================
Hibernate:
/* insert org.hello.jpa.collection.MemberCollection
*/ insert
into
MemberCollection
(city, street, zipcode, USERNAME, MEMBER_ID)
values
(?, ?, ?, ?, ?)
Hibernate:
/* insert collection
row org.hello.jpa.collection.MemberCollection.addressHistory */ insert
into
ADDRESS
(MEMBER_ID, city, street, zipcode)
values
(?, ?, ?, ?)
Hibernate:
/* insert collection
row org.hello.jpa.collection.MemberCollection.addressHistory */ insert
into
ADDRESS
(MEMBER_ID, city, street, zipcode)
values
(?, ?, ?, ?)
Hibernate:
/* insert collection
row org.hello.jpa.collection.MemberCollection.favoriteFoods */ insert
into
FAVORITE_FOOD
(MEMBER_ID, FOOD_NAME)
values
(?, ?)
Hibernate:
/* insert collection
row org.hello.jpa.collection.MemberCollection.favoriteFoods */ insert
into
FAVORITE_FOOD
(MEMBER_ID, FOOD_NAME)
values
(?, ?)
Hibernate:
/* insert collection
row org.hello.jpa.collection.MemberCollection.favoriteFoods */ insert
into
FAVORITE_FOOD
(MEMBER_ID, FOOD_NAME)
values
(?, ?)
=====================================================================
- DB에 저장된 내용
=====================================================================
SELECT * FROM MEMBERCOLLECTION ;
MEMBER_ID CITY STREET ZIPCODE USERNAME
1 용인시 명지로 15999 멤버컬렉션테스트
(1 행, 0 ms)
SELECT * FROM ADDRESS ;
MEMBER_ID CITY STREET ZIPCODE
1 용인시 김량장동 10000
1 광주시 신현리 20000
(2 행, 0 ms)
SELECT * FROM FAVORITE_FOOD ;
MEMBER_ID FOOD_NAME
1 탕수육
1 치킨
1 피자
(3 행, 0 ms)
=====================================================================
- 저장된 내용 조회
=====================================================================
MemberCollection memberCollection = new MemberCollection();
memberCollection.setUsername("멤버컬렉션테스트");
memberCollection.setHomeAddress(new Address("용인시" , "명지로" , "15999"));
memberCollection.getFavoriteFoods().add("치킨");
memberCollection.getFavoriteFoods().add("피자");
memberCollection.getFavoriteFoods().add("탕수육");
memberCollection.getAddressHistory().add(new Address("용인시","김량장동","10000"));
memberCollection.getAddressHistory().add(new Address("광주시","신현리","20000"));
em.persist(memberCollection);
em.flush();
em.clear();
MemberCollection findMember = em.find(MemberCollection.class , memberCollection.getId());
List<Address>addressHistory = findMember.getAddressHistory();
for(Address address : addressHistory){
System.out.println("address : " + address.getCity());
}
Set<String> favoriteFoods = findMember.getFavoriteFoods();
for(String favoriteFood : favoriteFoods){
System.out.println("favoriteFood : " + favoriteFood);
}
=====================================================================
- 조회 쿼리(지연로딩으로 작동함) (member insert 부분은 위에 작성했기에 주석처리함)
=====================================================================
Hibernate:
select
membercoll0_.MEMBER_ID as member_i1_7_0_,
membercoll0_.city as city2_7_0_,
membercoll0_.street as street3_7_0_,
membercoll0_.zipcode as zipcode4_7_0_,
membercoll0_.USERNAME as username5_7_0_
from
MemberCollection membercoll0_
where
membercoll0_.MEMBER_ID=?
Hibernate:
select
addresshis0_.MEMBER_ID as member_i1_0_0_,
addresshis0_.city as city2_0_0_,
addresshis0_.street as street3_0_0_,
addresshis0_.zipcode as zipcode4_0_0_
from
ADDRESS addresshis0_
where
addresshis0_.MEMBER_ID=?
address : 용인시
address : 광주시
Hibernate:
select
favoritefo0_.MEMBER_ID as member_i1_4_0_,
favoritefo0_.FOOD_NAME as food_nam2_4_0_
from
FAVORITE_FOOD favoritefo0_
where
favoritefo0_.MEMBER_ID=?
favoriteFood : 탕수육
favoriteFood : 치킨
favoriteFood : 피자
=====================================================================