JPA 多对多,仅包含 id 列表

问题描述 投票:0回答:1

为了简化问题,考虑我有一个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
的外键。

hibernate jpa spring-data-jpa domain-driven-design
1个回答
0
投票

两列都需要指定为连接列。考虑:

@ElementCollection
@CollectionTable(
  name = "person_location",
  joinColumns = { 
     @JoinColumn(name = "person_id"),
     @JoinColumn(name = "location_id")
  }
)
...

请在 JPA 表格中发布更多详细信息,以便可以得到经过测试的答案。

© www.soinside.com 2019 - 2024. All rights reserved.