JPA TABLE_PER_CLASS проблемы с ManyToOne - PullRequest
1 голос
/ 28 июля 2011

У меня есть следующая иерархия

@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

1 Ответ

1 голос
/ 18 сентября 2011

Нет ничего странного в том, что не удалось запросить MappedSuperClass.Согласно спецификации JPA 2:

2.11.2 Сопоставленные суперклассы .... Сопоставленный суперкласс, в отличие от сущности, не подлежит запросу и не должен передаваться в качестве аргумента операциям EntityManager или Query.Постоянные отношения, определенные сопоставленным суперклассом, должны быть однонаправленными.....

Я заполнил пробелы в коде, который вы разместили (без @MappedSuperClass), и как полиморфный запрос, так и отложенная загрузка, похоже, работают с Hibernate 3.5.6-Final.Может быть, я сделал что-то другое, что касается недостающих частей кода.Можете ли вы опубликовать еще более убедительный пример?

...