2012-05-17 33 views
0

假設我有一個Person,Building和Address類。一個人可以有很多地址,一個建築物可以有一個地址。在DB中,所有三個都有自己的獨立表格。地址錶鏈接的方式是使用fk_id列和類型列。通過將person_id作爲fk_id和設置類型存儲爲「person」來存儲人的地址,而對於建築物,將building_id存儲爲fk_id並將類型設置爲「building」。有沒有什麼方法可以映射這些關係,或者我需要將數據庫轉換爲使用鏈接表並執行多對多或僅使用HQL來檢索該數據?在休眠狀態下,多個一對多/一對一的關係到同一個班級

+0

你的建築物與地址有何不同? – Phani

+1

不知道我明白這個問題。該建築是與地址完全不同的實體。 – Rocket04

回答

0

找到答案,所需要的就是在集合上添加「where」條件。

0

你可以像這樣映射你的實體。

<class name="Address"> 
    <id name="addressId" column="addressId"> 
     <generator class="native"/> 
    </id> 
</class> 

<class name="Person"> 
    <id name="personId" column="personId"> 
     <generator class="native"/> 
    </id> 
    <set name="addresses" table="PersonAddress"> 
     <key column="personId"/> 
     <many-to-many column="addressId" 
     unique="true" 
     class="Address"/> 
    </set> 
</class> 

<class name="Building"> 
    <id name="id" column="buildingId"> 
     <generator class="native"/> 
    </id> 
    <many-to-one name="address" 
     column="addressId" 
     unique="true" 
     not-null="true"/> 
</class> 

你只需要一個額外的表PersonAddress。

+0

不幸的是,這不是我要找的。我知道如何實現我所需要的,如果我更改數據庫結構,但我想知道是否可以使用我描述的模型(地址表具有可映射到address_id或person_id的fk_id字段以及可以映射到被設置爲「person」或「building」 – Rocket04

0

您可以映射此像這樣:

@Entity 
public class Address { 
    @ManyToOne @JoinColumn(name="person_id") 
    private Person person; 

    @OneToOne @JoinColumn(name="building_id") 
    private Building building; 
} 

@Entity 
public class Person { 
    @OneToMany(mappedBy="person", targetEntity=Address.class) 
    private Set<Address> addresses; 
} 

@Entity 
public class Building { 
    @OneToOne(mappedBy="building") 
    private Address address; 
} 

在這個例子中,地址可以有任何一個人或一個大廈(它不應該有兩個)。此外,地址被認爲是關係的所有者,人或建築是該關係的「反面」方面。這就是說,要創建對象圖,您仍然可以使用級聯保存(註釋中的「級聯」屬性),以便您可以在內存中創建所有對象,並簡單地保存Person或Building,然後它應該自動保存地址對象以及它。

+0

當我評論其他響應時,我知道如何更改數據庫結構來實現我所需要的,但我想知道它是否可以在沒有任何更改的情況下完成。所以對於大樓,如果使用直接SQL,我們會看到類似這樣的東西: – Rocket04

+0

'SELECT * FROM building b INNER JOIN address a ON b.building_id = a.fk_id AND a.type ='building'WHERE b.building_id = 1' – Rocket04