以多对多关系排序(Java Spring)

时间:2018-03-09 00:38:52

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

有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;
}

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

2 个答案:

答案 0 :(得分:0)

List代替Set@OrderColumn注释结合使用:

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

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

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

答案 1 :(得分:-1)

Set基本上不符合插入顺序。 LinkedHashSet但是会​​保留您可以尝试的元素插入顺序。它会以正确的顺序将Point存储到数据库中,但很可能在从数据库中取出后它将再次混淆。你必须在这里有可行的选择:

  1. 请勿使用Set使用List insteed。
  2. 坚持Set并将private Integer index字段添加到Point并存储正确的索引 - 您可以在获取后对其进行排序而不会出现任何问题
  3. 如果您确保将点以正确的顺序保存到数据库中,那么您可以省略额外的列并按id排序,假设您使用唯一的,没有间隙,自动生成的PK序列