2012-05-17 26 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