2017-02-27 14 views
1

TextListとArticleという2つのクラスがあります。属性が存在しない可能性のあるオブジェクトのマッピング

public class Article() { 
    public int a_id; 
    public TextList text; 
} 

public class TextList(){ 
    private String text1; 
    private String text2; 
    private String text3; 
    private String text4; 
} 

そしてこのTEXT_IDのようなテーブル:

text_id  text_type text_content article_Id 
    1   text1  "Oh no"   1 
    2   text3  "He has a dog" 1 
    3   text4  "A Labrador" 1 

あなたが見ることができるように、のために、私は3つの文章(テキスト1、テキスト3、text4)を持っている 1のarticle_id。この記事では、テキストタイプ2はなく、問題ではありません。問題は、クラスTextListの文字列を正しくマップするには、どうすればのtext_type列をチェックし、それが属している属性にマップするのですか?また、テーブルに存在する場合と存在しない場合のある属性をどのようにマップできますか?

答えて

1

あなたが示したテーブルレイアウトに基づいて、基本的にはあなたが説明したテーブルを模倣する以下のようにモデル化できます。テーブルスキーマがロックされていない、あなたがわずかに異なる選択肢を使用することができれば

@Entity 
public class TextEntity { 
    @Id 
    @Column(name = "text_id") 
    private Long id; 

    @Enumerated 
    @Column(name = "text_type") 
    private TextType textType; 

    @Column(name = "text_content") 
    private string text; 

    @ManyToOne 
    @JoinColumn(name = "article_id", referencedColumnName = "article_id") 
    private Article article; 
} 

public enum TextType { 
    TEXT1, 
    TEXT2, 
    TEXT3, 
    TEXT4 
} 

しかし、私は同じことを達成するためにMap<>を特定@ElementCollectionを使用することをお勧めかもしれません。

@Entity 
public class Article { 
    @Id 
    @Column(name = "article_id") 
    private Long id; 

    @ElementCollection 
    private Map<String, String> textMap; 
} 

これは、テキストテーブルのエンティティを定義すると、Hibernateは、テーブルが自動的にそれがこのような何かに見える生成する必要がなくなり:値は以下のようになりながらMap<>キーはテキスト型になり

+-------------+----------------+------------+ 
| textMap_key | textMap_value | article_id | 
+-------------+----------------+------------+ 
| text1  | "Oh no"  | 1   | 
| text3  | "He has a dog" | 1   | 
| text4  | "A labrador" | 1   | 
+-------------+----------------+------------+ 

を実際のテキストコンテンツHibernateは自動的にarticle_id関係を維持します。

+0

ありがとうございましたが、同じモデル(Enumを意味しません)と同じデータベースを使用する方法はありませんか?私は作業中のプログラムをHibernateに切り替えようとしているので、テーブルのモデルを変更しないでください。 –

+1

'TextEntity'ではEnumを使う必要はありません。それを簡単に 'String'で置き換えてそのまま使用すると、同じテーブル構造を正確に与えることができます。 'String'は最終的に' anything 'になる可能性があるので、私はEnumに期待される値に限定された特定の有限データを保持する傾向があります。 – Naros

+0

こんにちは、あなたの提案を試みましたが、まだ私は新しい問題があります。 "text_type" = "info"(ちょうど例)のとき、このテーブルは1つ以上のエンティティに使用されます。テキストはクラスArticleに属しません。この場合の提案はありますか? Long Story short私は列の値をチェックして、この行がどのクラスのどのプロパティに属しているかを判断したい。それも可能ですか?事前にTy! –

関連する問題