2017-05-31 16 views
3

複数の属性を持つ1つのテーブルがあります。 これらの(排他的な)属性にアクセスするための2つのクラスが必要です。Hibernateと1つのテーブルにマップされた2つのクラス

@Entity 
@Table(name = "MY_TABLE") 
public class Foo { 

... 
    @Column 
    @NotNull 
    private String fooValue; 
} 

@Entity 
@Table(name = "MY_TABLE") 
public class Bar { 
... 
    @Column 
    private String barValue; 
... 
} 

基本的Barが読み取り専用では、テーブル内の値の一部に表示します。 Fooは他の値を更新するために使用され、BarはJavaアプリケーションを使用せずに作成された他の値を表示するために使用されます。

トラブルは、私は春のデータリポジトリを使用してFooを保存しようとすることです:

public interface FooRepository extends JpaRepository<Foo, Long> { 
} 

私はfooValuenullに設定されている例外を取得します。そして、ログにはfooValueNULLの挿入があります。私はそれを少しデバッグし、私はFooの保存が再び動作しなくなるまで、Barを完全にプロジェクトから削除して保存します。

私にとっては、Fooを保存しようとしても、HibernateがBarクラスをピックアップするように見えます。どうして?

私のスタックは次のとおりです。春のブート1.5.3、春データ、5.xの休止状態

+0

また、レイジーフェッチを使用することも考えられます。 – Rjiuk

答えて

0

は、率直に言って、私は2つのエンティティによってこのようにマッピングされた同じテーブルを見たことがありません。

通常は継承の設定を定義し、そこから上で動作します:

ベースのエンティティ

@Entity 
@Inheritance 
@DiscriminatorColumn(name="TABLE_TYPE") 
@Table(name="MY_TABLE") 
public class MyTable implements Serializable{ 
    @Id 
    @GeneratedValue 
    protected int id; 
    ... 
} 

フー・エンティティ

@Entity 
@DiscriminatorValue("FOO") 
public class FooTable extends MyTable { 
    @Column 
    @NotNull 
    private String fooValue; 
} 

バーエンティティ

@Entity 
@DiscriminatorValue("BAR") 
public class FooTable extends MyTable { 
    @Column 
    private String barValue; 
} 

これは単一のテーブル継承戦略であり、あなたのケースに最も適しているようです。

+0

ええ、私はこれらの2つのクラスに共通点がないため、継承を避けたかったのです。データは重なり合わないように分割されます。だから私は、簡単な方法は2つの全く異なるクラスを持つことだと思った。私はまだ冬眠がそれらを区別することができない理由は困惑しています。 –

+0

エンティティを定義するこの方法は、JPA仕様には絶対含まれていません。 Hibernate ..少なくとも最新版はその仕様に大きく準拠しています。私は起動時に不平を言うことはありませんが、実行時の動作は予測できないようです –

0

あなたはまた、FOOとBARのような適切なフィールドを持つ2つの異なるクラスを構築し、それらが@Embeddableにし、1つの余分クラスを作ることができ、継承回避したい場合:

class SuperFoo { 
    //make some ID 

    @Embedded 
    @Basic(fetch = FetchType.LAZY) 
    Foo foo; 

    @Embedded 
    @Basic(fetch = FetchType.LAZY) 
    Bar bar; 
} 

を次に、あなただけのこののいずれかを取得することができますクラス。データベースでは、通常のテーブルのように見えます。

関連する問題