【问题标题】:Ordering in many-to-many relation (Java Spring)以多对多关系排序(Java Spring)
【发布时间】:2018-03-09 00:38:52
【问题描述】:

有 2 个模型具有多对多关系:

@Entity
public class Map {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @JsonIgnore
  private long mapId;

  @NotBlank
  private String title;

  @ManyToMany(cascade = CascadeType.ALL)
  @JoinTable(name = "route_points",
             joinColumns = @JoinColumn(name = "mapId", referencedColumnName = "mapId"),
             inverseJoinColumns = @JoinColumn(name = "pointId", referencedColumnName = "pointId"))
  private Set<Point> points;
}

@Entity
public class Point {
  @Id
  private String pointId;
  @NotBlank
  private String city;
  @ManyToMany(mappedBy = "points")
  private Set<Map> maps;
}

我必须在集合中保存点的顺序并将其记录到中间表中。怎么做?谢谢。

【问题讨论】:

    标签: java database spring jpa spring-data-jpa


    【解决方案1】:

    结合@OrderColumn 注解使用List 而不是Set:

    https://docs.oracle.com/javaee/6/api/javax/persistence/OrderColumn.html

    这将在route_points 中创建一个额外的列来跟踪元素的顺序,包括插入、删除和重新排序。

    请注意,JPA 会将顺序保持为连续数字,因此对列表的大多数(如果不是全部)结构修改将导致每个元素的更新语句。

    【讨论】:

      【解决方案2】:

      Set 基本上没有插入顺序。 LinkedHashSet 但是将保持插入元素的顺序,您可以尝试这样做。它将以正确的顺序将Point 存储到数据库中,但很可能在从数据库中获取后再次混淆。您必须在这里找到可行的选择:

      1. 不要使用Set,而是使用List。
      2. 坚持使用 Set 并将 private Integer index 字段添加到 Point 并存储正确的索引 - 您将能够在获取后对其进行排序而不会出现任何问题

      如果您确保点将以正确的顺序保存到数据库中,那么您可以省略附加列并按 id 排序,假设您使用唯一、无间隙、自动生成的 PK 序列

      【讨论】:

      • '如果您确保点将按正确的顺序保存到数据库中,那么您可以省略其他列并按 id 排序' - 不,不是真的。您似乎认为一旦创建了Map,OP 将永远不会在列表中间插入新的Point。此外,插入顺序是一个实现细节,我认为 JPA 规范不保证它
      猜你喜欢
      • 2015-07-28
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 2011-08-23
      • 1970-01-01
      • 2011-06-22
      • 2011-02-22
      相关资源
      最近更新 更多