有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。
答案 0 :(得分:0)
将List
代替Set
与@OrderColumn
注释结合使用:
https://docs.oracle.com/javaee/6/api/javax/persistence/OrderColumn.html
这将在route_points
中创建一个额外的列来跟踪元素的顺序,包括插入,删除和重新排序。
请注意,JPA会将排序保持为连续数字,因此对列表进行大多数(如果不是全部)结构修改将导致每个元素的更新语句。
答案 1 :(得分:-1)
Set
基本上不符合插入顺序。 LinkedHashSet
但是会保留您可以尝试的元素插入顺序。它会以正确的顺序将Point
存储到数据库中,但很可能在从数据库中取出后它将再次混淆。你必须在这里有可行的选择:
Set
使用List
insteed。Set
并将private Integer index
字段添加到Point
并存储正确的索引 - 您可以在获取后对其进行排序而不会出现任何问题如果您确保将点以正确的顺序保存到数据库中,那么您可以省略额外的列并按id
排序,假设您使用唯一的,没有间隙,自动生成的PK序列