다형적인 ManyToOne 연관
특징
- 다형적인 연관 관계는 Table per concrete class with unions, Table per class per hierachy, Table per subclass 모두 사용할 수 있다.
- lazy=true로 설정했다면, 하위 타입으로 바로 캐스팅 할 수 없다. Proxy 객체를 가져왔기 때문이다.(XML 설정)
- session.load()를 사용해서 해당 타입으로 다시 로딩하여 사용하거나, eager fetch query를 사용한다.
Proxy Narrowing
User user = (User) session.get(User.class, userId);
BillingDetails bd = user.getDefaultBillingDetails();
// Narrow the proxy to the subclass, doesn't hit the database
CreditCard cc =
(CreditCard) session.load( CreditCard.class, bd.getId() );
expiryDate = cc.getExpiryDate();
Eager Fetch Query
User user = (User)session.createCriteria(User.class)
.add(Restrictions.eq("id", uid) )
.setFetchMode("defaultBillingDetails", FetchMode.JOIN)
.uniqueResult();
// The users defaultBillingDetails have been fetched eagerly
CreditCard cc = (CreditCard) user.getDefaultBillingDetails();
expiryDate = cc.getExpiryDate();
- OneToOne 연관도 이것과 같다.
- 애노테이션을 사용한 맵핑에서는 기본 FetchMode가 EAGER다. 따라서 불필요한 쿼리가 생길 수도 있다.