2011-10-19 5 views
4

が、私はこのような何かを持っているInheritanceType.JOINED ..多形「GET」は、

多くの議席から1つの座席を持っている車のクラス。シートには、サブクラスLeatherSeatがあります。

public class Car { 
    private Seat seat; 
    ... 
    @ManyToOne(fetch = FetchType.LAZY) 
    public Seat getSeat() { 
    return seat; 
    } 
    ... 
} 

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
public class Seat { 
    private String id; 
    private String color; 
} 

@Entity 
public class LeatherSeat extends Seat { 
    private String leatherType; 
} 

私は自分の車を作成して、私の車の座席にそれがデシベルにすべて正しく保存されますLeatherSeatを作ります。私が車(CriteriaやQueryリストを使って)を取得したいときにgetSeat()を読むと、Seatは常にSeatであり、LeatherSeatではありません。私は(例外)キャストすることはできませんと一見手動でidによってLeatherSeatを取得する必要があります。

JOINED継承型を使用する場合の制限ですか、何か不足していますか?シートをレザーシートにするにはどうすればいいですか?

答えて

1

getSeatを使用しているように遅延フェッチを実行すると、サブクラスではなく親を取得することしかできません。私はFetchType.EAGERでこの同じ例を試して、getSeatはLeatherSeatを正しく返します。

私は、EAGERをフェッチするときにHibernateがLeatherSeatでCarを取得できるのは確信していますが、LAZYフェッチを実行すると、Hibernateはそれを取得できないようです。そこに何かが壊れているようです。

このシナリオに関しては、InheritanceType.JOINEDに識別子の列に関するチケットがあります。 https://hibernate.onjira.com/browse/ANN-140ですが、チケットは拒否され、hibernateがInheritanceType.JOINEDの弁別子を必要とするにはエレガントであることを示しています。それでも、遅延クラスのフェッチでサブクラスを正しく返すことはできません。

このチケットhttps://hibernate.onjira.com/browse/HHH-271?focusedCommentId=44089#comment-44089は、この問題に固有のもので、「怠惰なフェッチでどのサブクラスを取得するのか」という答えがありました。

両方のチケットは古いチケットであり、拒否されました。私には問題のようだ。しかし今のところ、これは異なる継承型に変更するか、熱心なフェッチタイプを使用する必要があります。これは、これが休止状態の設計に従っているためです。

2

LAZYの場合、座席は「プロキシ」になります。これは、車がインスタンス化されたときにインスタンス化されます。その時、Hibernateはシートが革であるかどうかを知らない。

プロパティをトラバースして遅延ロードすると、Hibernateはシートがレザーであることを知りますが、プロキシのクラスを遡及的に変更することはできません。しかし、すべてのデータがそこにあります。あなたが何らかのメソッドをオーバーライドした場合、シートはLeatherSeatとして応答します。

あなたが本当にLeatherSeatにこのオブジェクトをキャストする必要がある場合は、http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/engine/PersistenceContext.html#unproxy(java.lang.Objectを使用してプロキシ)

がLeatherSeatプロキシが常にシート、ではないだろう理由の詳細については、このブログを参照してくださいUnboxのことができます。http://sessionfactory.blogspot.co.uk/2010/08/hacking-lazy-loaded-inheritance.html

これをここではHibernateのドキュメントで簡単に説明しています:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching-proxies