0

假设我有一个 Person、Building 和 Address 类。一个人可以有多个地址,而建筑物可以有一个地址。在数据库中,这三个都有自己单独的表。Address 表的链接方式是使用 fk_id 列和 type 列。通过将 person_id 存储为 fk_id 并将类型设置为“person”来存储人员的地址,而对于建筑物,您将 building_id 存储为 fk_id 并将类型设置为“building”。有什么方法可以映射这些关系,或者我需要将数据库转换为使用链接表并进行多对多还是只使用 HQL 来检索该数据?

4

3 回答 3

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。

于 2012-05-17T12:28:34.910 回答
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;
}

在这个例子中,地址可以有一个人或一个建筑(它不应该同时有)。此外,Address 被认为是关系的所有者,而 Person 或 Building 是该关系的“反面”。

话虽如此,要创建对象图,您仍然可以使用级联保存(注释上的“级联”属性),以便您可以在内存中创建所有对象,并简单地保存人员或建筑物,它应该自动保存Address 对象以及它。

于 2012-05-17T12:32:24.680 回答
0

找到了答案,所需要的只是在集合上添加一个“where”条件。

于 2012-05-18T17:30:44.050 回答