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