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