JPA

2012-01-06 10 views
0

でのデータ型の目的のために継承を使用して、私は次のようになり、いくつかのエンティティがあります。スーパークラスで定義されたbyte[]は、各サブクラスのエンティティの興味深い部分であるJPA

@Entity 
public abstract class AbstractEntity{ 

    @Id 
    private Long id; 
    String name; 
    User author; 
    @Lob 
    byte[] data; 

} 


public class EntityOne extends AbstractEntity{ 
    // nothing new 
} 


public class EntityTwo extends AbstractEntity{ 
    // nothing new 
} 


public class EntityThree extends AbstractEntity{ 
    // nothing new 
} 

を。私がサブクラス化したいのは、プログラムの一部にEntityThreeが必要であり、プログラムの一部にEntityTwoが必要なので、タイピング規則を適用することです。 byte[]は、サブクラスとサブクラスとは全く異なる意味を持ちます。

私はサブクラスのいずれかがフィールドやメソッドを追加することは期待していないので、少し奇妙に思えます...私は入力ツールとしてのみ継承を使用します。

これは合理的なデザインですか?これを達成するためのより良い方法は?ベストプラクティスが壊れていますか?

+0

サブクラス固有のものがない場合、サブクラス化はなぜですか? –

+0

バイト[]のみに違いがあるためです。そして、私は正しいサブクラスを持っていることを確認するためにinstanceOfのようなことをやりたいと思っています。 – b3bop

答えて

2

これは良いOOプラクティスです。データベースの場合、SINGLE_TABLE Inheritance strategy(デフォルト)を使用し、カスタム@DiscriminatorValueをサブクラスごとに使用してください。そうしないと、テーブルにクラス名が取得されます。

DBAの観点からは、これとプロパティTYPEの1つのクラスを使用することに違いはありません。

OOの場合、サブクラスははるかに有用です。退屈なif-then-elseやinstanceof構造ではなく、特定のメソッドを別々に実装したり、訪問者や戦略パターンを実装したりすることができます。

+0

はい、私はちょうど訪問者のパターンを読んでいます。私を安心してくれてありがとう。 – b3bop

0

正確なユースケースを知らなくても言い難いですが、すべてのエンティティで共通フィールドを再利用したいと思うようですが、他のエンティティにはAbstractEntityへの参照がありません。この場合、スーパークラスを@Entityではなく@MappedSuperclassにマップする必要があります。各エンティティは独自のテーブルを持ち、マッピングされたスーパークラスで定義されたマッピングを上書きできます。

少なくとも、Hibernateで少なくともinstanceofを使用して、エンティティの継承が必要な場合は、基本クラスへのプロキシがある可能性があるため、問題が発生することに注意してください外部キーが指している正確なサブクラスであり、したがってサブクラスのインスタンスではありません。