2012-02-27 56 views
0

我在數據庫中具有三個表(命名爲A,B和C):休眠:財產創造映射在多個聯接的表

 
A 
----- 
ID 
B_ID 
----- 
 
B 
----- 
ID 
C_ID 
----- 
 
C 
----- 
ID 
----- 

分別地,我的類A, B和C.


public class A{ 
    private Long id; 
    private Long b_id; 
} 

public class B{ 
    private Long id; 
    private Long c_id; 
} 

public class C{ 
    private Long id; 
} 

正如你可以爲「A」級的代碼中看到的,我制訂了B​​類,而不是對象的ID,從動地:


<property name="b_id" column="B_ID" type="java.lang.Long" not-null="false"> 

現在我需要爲的ID做到這一點「C」爲好,即,使得我可以直接與

a.getC_id();

得到A的相關C對象的ID我怎樣才能做到這一點?這應該這樣做,以便當Hibernate從數據庫讀取A對象時,C的ID被加入到查詢中,也就是說沒有額外的查詢或子查詢(a.getB()。getC_id()是不可接受的) 。

+1

Hibernate是一個ORM。它應該將表映射到彼此具有關聯的對象。你沒有使用它,因爲它打算被使用,並因此與工具作鬥爭。您應該按照預期使用Hibernate,或根本不使用Hibernate。 – 2012-02-27 12:55:05

+0

有時候在現實生活中,有些事情是以非標準方式進行的。我意識到實現我想要的「更好」的方式,但是由於各種外部原因,如果可能的話,這是要走的路。 – simon 2012-02-27 12:57:23

回答

1

首先創建一個DTO對象,

public class ADTO { 
    private Long a_id; 
    private Long b_id; 
    private Long c_id; 
    public ADTO(Long a_id,Long b_id,Long c_id){ 
     this.a_id = a_id; 
     this.b_id = b_id; 
     this.c_id = c_id; 
    } 
} 

現在使用的查詢,

select new com.foo.ADTO(a.id,b.id,c.id) from A a, B b, C c where a.id = b.a_id and b.id = c.b_id

你甚至可以用類A做到這一點,我已經避免,因爲我不知道,如果A,C id與one to one之間的關係。 DTO始終安全。

閱讀API文檔here或示例here瞭解如何調整HQL select。

1

作爲ManuPK答案的一個變種,您還可以將A的實例放入DTO中。

public class AWithCID { 
    public final A a; 
    public final cID; 
    public AWithCID(A a, Long cID) { this.a = a; this.cID = cID; } 
} 

select new AWithCID(a, b.cID) from A a, B b where a.bID = b.id