2017-02-27 49 views
1

假設我有兩個名爲TextList和Article的類。使用可能不存在的屬性映射對象

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 

正如你可以看到,對於ARTICLE_ID 1我有三個文本(文本,文字3,文本4)。本文沒有文本類型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 
} 

但是,如果表架構不鎖,你可以使用一個稍微不同的選擇,我可能會建議使用@ElementCollection標識Map<>來完成同樣的事情。

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

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

這避免了定義文本表實體和Hibernate會生成表自動看起來是這樣的:

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

Map<>關鍵將是文本型,而價值將是實際的文字內容。 Hibernate會自動爲你維護article_id關係。

+0

感謝您的回答,但沒有辦法使用相同的模型(意味着沒有枚舉)和相同的數據庫?我試圖將工作的程序切換到Hibernate,所以我寧願不改變表格的模型。 –

+1

'TextEntity'不需要你使用Enum。你可以很容易地用'String'來替換它,並且按原樣使用它,這會給你提供完全相同的表結構。我傾向於選擇Enum將特定的有限數據限制在期望值以下,因爲'String'最終可能是「任何東西」。 – Naros

+0

嗨,我已經嘗試過您的建議,但我仍然有一個新問題。事情是這個表是用於超過1個實體,比如說當「text_type」=「info」(僅僅是一個例子)時,那麼文本不再屬於類文章,而是屬於其他內容。在這種情況下的任何建議?長話短說我想檢查列的值來決定該行屬於哪個類的屬性。這甚至有可能嗎? Ty提前。 –

相關問題