2017-08-30 28 views
0

我正在開發一個遺留應用程序,並被要求集成Hibernate(這是我第一次使用它)。這個程序有3個表(其中包括)如下:從3個表中定義hibernate實體

Table SITE    Table PARAMS  Table TRANS 
==========    ==============  =============== 
pk: id (INT)   pk: p_id (INT)  pk: t_id (INT) 
    lang_id (INT)  name (CHAR)   fk: p_id (INT) 
         value (INT)   fk: lang_id (INT) 
              text (CHAR) 

然後,我需要得到PARAMS參數與他們的翻譯,存儲在TRANS一起,根據爲應用程序定義的語言,這是存儲在現場。

我一直在努力嘗試理解如何使表的連接獲取實體的數據。我嘗試使用@JoinTable,但我無法弄清楚如何進行3路加入,所以我開始嘗試@SecondaryTables,但沒有運氣。

我定義了這個實體來映射請求的數據(我知道這不會像現在這樣),我試圖找出正確的方式來進行連接。

@Entity 
@Table(name = "params") 
@SecondaryTables(
{ 
    @SecondaryTable(name = "trans", pkJoinColumns = @PrimaryKeyJoinColumn(name = "p_id")), 
}) 
public class Tparam implements Serializable 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "p_id") 
    private int id; 

    @Column(name = "name") 
    private String Name; 

    @Column(name = "text") 
    private String visibleText 

    ... 
} 

任何幫助表示讚賞!


以供參考,該SQL查詢給了我什麼,我想:

SELECT * FROM params, lang, site WHERE params.p_id = lang.p_id AND lang.lang_id = site.lang_id; 

回答

1

您需要定義3個實體:

1帕拉姆 2郎 3站點

@Entity 
@Table(name = "params") 
public class Tparam implements Serializable 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "p_id") 
    private int id; 

    @Column(name = "name") 
    private String Name; 

    @Column(name = "text") 
    private String visibleText 

    ... 
} 

@Entity 
@Table(name = "lang") 
public class Lang implements Serializable 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "lang_id") 
    private int id; 

    @ManyToOne 
    @JoinColumn(name = "p_id") 
    private Tparam param; 

    ... 
} 

@Entity 
@Table(name = "site") 
public class Site implements Serializable 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "site_id") 
    private int id; 


    @ManyToOne 
    @JoinColumn(name = "lang_id") 
    private Lang lang 

    ... 
} 

然後,當您需要數據時,您可以使用Criteria(或Query) Site實體獲取數據。每個網站記錄包含一個Lang,每個記錄包含一個Tparam

+0

經過幾次不同的嘗試,這是更好的選擇。謝謝@Moodi。 – Rodrigo