У меня есть следующая иерархия
@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Order {
...
@Entity
@Table(name = "b_order", schema = "public")
public class BOrder extends Order implements java.io.Serializable {
...
@Entity
@Table(name = "s_order", schema = "public")
public class SOrder extends Order implements java.io.Serializable {
У меня также есть класс, в котором Tr содержит ссылки на оба конкретных подкласса
@Entity
@Table(name = "tr", schema = "public")
public class Tr implements java.io.Serializable {
...
private SOrder sOrder;
private BOrder bOrder;
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "s_order_id", nullable = false)
public SOrder getSOrder() {
return this.sOrder;
}
... same for BOrder
С классами, определенными выше, ленивая загрузка работает нормально:
Tr foundTr = trDAO.findById(trId);
// test lazy loading BOrder, SOrder
BOrder foundBOrder = foundTr.getBOrder();
SOrder foundSOrder = foundTr.getSOrder();
assertNotNull(foundSOrder);
assertNotNull(foundBOrder);
Но если я попытаюсь выполнить полиморфный запрос, он не сработает:
public List<Order> getOrdersByUId(Long uId) {
return (List<Order>) em.createQuery( //
" select o from Order o " //
+ " order by o.created desc ") //
.getResultList();
Я получаю ошибку:
Заказ не отображается
Основано на этом посте: http://java.dzone.com/articles/jpa-implementation-patterns-mapping
Кстати, при использовании прокси Hibernate, имейте в виду, что ленивая загрузка
класс, сопоставленный с любой из трех вышеуказанных стратегий, всегда возвращает
прокси, который является экземпляром суперкласса.
Blockquote
, что соответствует странному поведению, которое я вижу.
Однако, вот где это становится странным. Если я изменю родительский класс на
@Entity
// @MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Order {
то есть я закомментирую аннотацию MappedSuperClass, полиморфный запрос работает (создает правильное объединение).
Проблема заключается в том, что когда я делаю, загрузка LAZY из Tr в два подкласса перестает работать.
Есть идеи? Могу ли я использовать собственный запрос для выполнения объединения вместо JPA?
Я использую JPA 2.0 в JBoss 6.0.0, используя Hibernate - любая версия поставляется с JBoss