2017-08-28 20 views
2

私は同じフィールドを持つ2つのオブジェクトを持っていますが、異なるテーブルからです(foo_somethingとbar_somethingは実際には単純なテーブルではなく、いくつかの結合操作の結果があります)。私は@Subselectデータをフェッチするために休止状態注釈を使用します。このようなクラス構造にすることはできますか?注釈は継承されないため、このクラス構造は機能しません。私は@Inheritanceアノテーションを使用した場合、私はエラーUnknown column foo_somethingca0.DTYPEクラス継承を持つHibernateのSubselect

class Something { 

    @Id @Column Long id; 
    @Column String name; 
    @Column String description; 

    //getters, setters, constructors 

} 

@Entity 
@Immutable 
@Subselect("SELECT id, name, description FROM foo_something") 
class FooSomething extends Something { 

} 

@Entity 
@Immutable 
@Subselect("SELECT id, name, description FROM bar_something") 
class BarSomething extends Something { 

} 

UPDを取得します。

おかげで、@HenryMartensは、私は今、それがうまく働いて、TABLE_PER_CLASS戦略、および作られたクラスの抽象と注釈@Entity@Inheritanceを追加しました:

@Entity 
@Inheritance(strategy = TABLE_PER_CLASS) 
abstract class Something { 

    @Id @Column Long id; 
    @Column String name; 
    @Column String description; 

    //getters, setters, constructors 

} 

@Entity 
@Immutable 
@Subselect("SELECT id, name, description FROM foo_something") 
class FooSomething extends Something { 

} 

@Entity 
@Immutable 
@Subselect("SELECT id, name, description FROM bar_something") 
class BarSomething extends Something { 

} 

答えて

1

DTYPEを休止状態に識別子列です。あなたの例のように同じデータベーステーブルに残っているいくつかのオブジェクトの違いを伝えるために使用されます。 弁別子列を@DiscriminatorColumn注釈で追加することができます。

具体的なクラスでは、@DiscriminatorValueを使用して、注釈付きクラスの識別子列の値を設定できます。例えば

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@DiscriminatorColumn(name="DISC", discriminatorType=STRING, length=20) 
class abstract Something { 

    @Id 
    @Column 
    Long id; 

    @Column 
    String name; 

    @Column 
    String description; 

    //getters, setters, constructors 
} 

@Entity 
@Table("FOO_SOMETHING") 
@Immutable 
@DiscriminatorValue("FooSomething") 
class FooSomething extends Something { 

} 

@Entity 
@Table("BAR_SOMETHING") 
@Immutable 
@DiscriminatorValue("BarSomething") 
class BarSomething extends Something { 

} 
+0

私の基本クラス 'Something' - それはそれは私が' BarSomething'に複製したくないフィールド、ゲッターとセッターの一覧と簡単な基底クラス、だ、テーブルではありません'FooSomething'のため、' @ Table'アノテーションをベースクラスで使用することができないため、 'SchemaManagementException:Schema-validation:missing table [SOMETHING]'が発生します。このクラスは抽象クラスです。 –

+0

@Denis Gavrus次に、あなたは 'Something'クラス抽象クラスを作成しなければなりません。 'InheritanceType.TABLE_PER_CLASS'を使って' FooSomething'と 'BarSomething'のそれぞれのテーブルを得ることができます。 –

関連する問題