为了简化问题,考虑我有一个Location聚合,它可以独立存在。这是一个例子:
class LocationId {
String value;
}
class Location {
LocationId value;
// other attributes
}
也是一个 Person 类,它可以与零个或多个 Location 实例关联。在纯粹的面向对象模型中,我会有这样的东西:
class PersonId {
String value;
}
class Person {
PersonId id;
List<LocationId> locations;
void addLocation(Location location) {
// perform checks on location
// associate location id with person
}
void removeLocation(Location location) {
// perform checks on location
// disassociate location id from person
}
}
要将这些模型映射到数据库,我将使用以下结构:
location
带有主键的表 (id
)person
带有主键的表 (id
)person_location
表(其中 person_id
和 location_id
作为 person
和 location
的外键)我的问题是
如何将
locations
属性映射到数据库而不修改我的域模型类,只需添加注释?
我最接近的是使用这种方法。
@ElementCollection
@CollectionTable(
name = "person_location",
joinColumns = @JoinColumn(name = "person_id")
)
@AttributeOverride(name = "value", column = @Column(name = "location_id"))
但是,在生成表时,只创建了
person_location.person_id
到person.id
的外键,缺少person_location.location_id
到location.id
的外键。
两列都需要指定为连接列。考虑:
@ElementCollection
@CollectionTable(
name = "person_location",
joinColumns = {
@JoinColumn(name = "person_id"),
@JoinColumn(name = "location_id")
}
)
...
请在 JPA 表格中发布更多详细信息,以便可以得到经过测试的答案。