Hibernate中同一个类的多个一对多/一对一关系

时间:2012-05-17 11:38:39

标签: java hibernate

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

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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(它不应包含两者)。此外,地址被视为关系的所有者,而人或建筑物是该关系的“反向”方。

话虽这么说,要创建对象图,你仍然可以使用级联保存(注释中的“级联”属性),这样你就可以在内存中创建所有对象,只需保存Person或Building,就可以了应该自动保存Address对象。

答案 2 :(得分:0)

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

相关问题