2015-12-14 28 views
4

我不知道是否有獲取多個表只有一個java類 用於爲例一種可能性:Hibernate的一個班多個表

TABLE LABELS; 
TABLE STANDARDS; 
TABLE REFERENCES; 

映射到同一類

public Class Information { 

    private String type; // the type is the element who have to do the mapping => LABELS/STANDARDS/REFERENCES 
    ... 
} 

這是由於技術原因,我不可能爲每種類型構建一個類(我知道一些遺產應該很酷)。

謝謝

吉爾斯

編輯:

我會盡力expain多一點:)

我使用JMS服務來獲取信息。每條消息都有一個特殊的類型,(在我的例子中:「標籤」,「標準」和「引用」)。

通過使用這些類型,我想persit信息在各自的表。每個消息的結構都完全相同,這就是爲什麼我想要使用獨特的POJO。

我希望它更好地解釋:)

編輯2:

TABLE LABELS (
    ID PRIMARY KEY AUTO_INCREMENT, 
    MESSAGE VARCHAR(255), 
    AUTHOR VARCHAR(255) 
); 
TABLE STANDARDS(
    ID PRIMARY KEY AUTO_INCREMENT, 
    MESSAGE VARCHAR(255), 
    AUTHOR VARCHAR(255) 
); 
TABLE REFERENCES (
    ID PRIMARY KEY AUTO_INCREMENT, 
    MESSAGE VARCHAR(255), 
    AUTHOR VARCHAR(255) 
); 

和這裏的的JMS

headers : 
    type : label 
body: 
    {message:"name of the country",author:"john doe"} 

headers : 
    type : label 
body: 
    {message:"nom du pays",author:"jenny doe"} 

headers : 
    type : reference 
body: 
    {message:"country",author:"john doe"} 

一些例子,我希望把它們放到信息類和堅持他們到正確的表

+0

我知道,問題是,我使用反射在我的代碼什麼的附帶信息的類型,從JMS服務 –

+0

看到@ PeterRader完成;)我編輯了我的帖子 –

回答

1

東西試試這個:

@MappedSuperclass 
public class Base { 
    private String message; 
    private String autor; 
    @Column(name = "MESSAGE") 
    public String getMessage(){ 
    return message; 
    } 
    public void setMessage(final String message) { 
    this.message = message; 
    } 
    @Column(name = "AUTOR") 
    public String getAutor(){ 
    return autor; 
    } 
    public void setAutor(final String autor) { 
    this.autor = autor; 
    } 
} 

而且三類:

@Entity 
@Table(name="LABELS") 
public class Labels extends Base{}; 

而且

@Entity 
@Table(name="STANDARDS") 
public class Standards extends Base{}; 

而且

@Entity 
@Table(name="REFERENCES") 
public class References extends Base{}; 

現在你可以堅持用數據:

Base b; 
if (info.getType().equals("REFERENCES")) { 
    b=new References(); 
} else if (info.getType().equals("LABELS")) { 
    b=new Labels(); 
} else if (info.getType().equals("STANDARDS")) { 
    b=new Standards(); 
} else { 
    return; 
} 
b.setMessage(info.getMessage()); 
b.setAutor(info.getAutor()); 
Transaction t = session.beginTransaction(); 
session.persist(b); 
t.commit(); 
+0

我現在試圖做到這一點,如果它有效,我會回到你身邊:)我必須放棄這個想法( –

+0

可能是正確的解決方案,但請注意,類Base應該使用@MappedSuperclass註釋進行註釋。 –

+0

@AlanHay如果該類沒有使用此MappedSuperclass註釋,那麼有什麼區別? –

0

你可能會問,如果你可以做一個table per subclass映射。每個表可以有一個類,但都從一個公共基類繼承。或者,如果您要構建只讀映射,則可以在所有相關表上創建一個UNION視圖,並使用Hibernate映射視圖。像

-- SQL 
CREATE VIEW information AS 
    SELECT 'LABEL' AS type,... FROM labels 
    UNION 
    SELECT 'STANDARD',... FROM standards 
    UNION 
    SELECT 'REFERENCE',... FROM references 
    ; 

/* Java */ 
@Entity 
@Table(name="information") 
public class Information { 
    ... 
} 
+0

問題是我想要讀/寫映射:/但它是一個不錯的主意(我注意到它的未來):) thx –

+0

但不幸的是,我不是數據庫管理員,所以我沒有DDL權限:( –

+0

在這裏沒有數據庫級別的繼承,所以JPA繼承層次結構不是一個有效的解決方案 –