1

I have the following hierarchy

@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 {

I also have a class that Tr has references to both concrete subclasses

@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

With the classes defined as above the lazy loading works fine:

Tr foundTr = trDAO.findById(trId);
// test lazy loading BOrder, SOrder
BOrder foundBOrder = foundTr.getBOrder();
SOrder foundSOrder = foundTr.getSOrder();
assertNotNull(foundSOrder);
assertNotNull(foundBOrder);

But if I try to execute a polymorphic query it doesn't work:

public List<Order> getOrdersByUId(Long uId) {
    return (List<Order>) em.createQuery( //
        " select o from Order o " //
            + " order by o.created desc ") //
            .getResultList();

I get an error:

Order is not mapped

Based on this post: http://java.dzone.com/articles/jpa-implementation-patterns-mapping

BTW, when using Hibernate proxies, be aware that lazily loading a class mapped with any of the three strategies above always returns a proxy that is an instanceof the superclass. Blockquote

which matches the strange behavior I'm seeing.

However, this is where it gets weird. If I change the parent class to

@Entity
// @MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Order {

that is I comment out the MappedSuperClass annotation, the polymorphic query works (creates the correct union). The problem is when I do that the LAZY loading from Tr to the two subclasses stops working.

Any ideas? Can I just use a native query to perform the union instead of JPA?

I'm using JPA 2.0 in JBoss 6.0.0 using Hibernate - whatever version ships with JBoss

1 Answers1

1

There is nothing strange with failing to query MappedSuperClass. According JPA 2 specification:

2.11.2 Mapped Superclasses .... A mapped superclass, unlike an entity, is not queryable and must not be passed as an argument to EntityManager or Query operations. Persistent relationships defined by a mapped superclass must be unidirectional. ....

I filled the blanks in code you posted (without @MappedSuperClass) and both polymorphic query and lazy loading seem to work with Hibernate 3.5.6-Final. Maybe I made sometihing different way, what it comes to missing parts of code. Can you post even more compelete example?

Mikko Maunu
  • 41,366
  • 10
  • 132
  • 135
  • I think you got it right. I was having a similar problem and swapping @ MappedSuperClass for @Entity fixed it. I was never querying directly for the concrete implementations but querying for the parent wasn't working working for me... until now. – spaaarky21 Jun 23 '12 at 03:27