【问题标题】:JPA : How to save list with order in a many-to-many relationshipJPA:如何以多对多关系保存带有顺序的列表
【发布时间】:2016-01-12 09:44:46
【问题描述】:

当我持久化具有顺序的列表时,数据库中的结果具有不同的顺序。如何在 JPA 中保持与列表顺序的多对多关系?

@Entity
@Table(name = "house")
public final class House {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Basic(optional = false)
    @Column(name = "name")
    private String name

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "house_room",
            joinColumns =
            @JoinColumn(name = "id_house", referencedColumnName = "id"),
            inverseJoinColumns =
            @JoinColumn(name = "id_room", referencedColumnName = "id"))
    private List<Room> rooms;
}

房屋对象:

Room room1 = new Room();
room1.setName("Kitchen");

Room room2 = new Room();
room2.setName("Bathroom");

Room room3 = new Room();
room3.setName("Bedroom");

List<Run> runs = new ArrayList<Run>();
rooms.add(0,room2);
rooms.add(1,room1);
rooms.add(2,room3);

House cottage = new House();
cottage.setRooms(rooms);

persist(cottage); // order in database should be "room2", "room1" then "room3" but it is saved as "room1", "room2" then "room3"

【问题讨论】:

  • 数据库记录没有“顺序”。
  • 已更正。我的错误
  • 最终无关紧要,数据库中的记录仍然没有任何特定的顺序。连接表是否有特定的列?
  • 还没有,所以我必须添加订单列。感谢您的帮助。
  • 我已经可以预测下一个问题了:如何在ManyToMany映射中设置连接表的列?

标签: java jpa many-to-many eclipselink


【解决方案1】:

在 JPA 中有两种使用 @OrderBy 和 @OrderColumn 注释对列表进行排序的方法。 @OrderColumn 或许正是您要找的。​​p>

@OrderBy

根据实体或元素的特定属性的比较指定排序规则

例子:

@OrderBy("name ASC")
private List<Room> rooms;

通过在映射上添加@OrderBy 注释,我们可以表明我们希望房间按其名称属性按字母升序排列。 注意:我们不需要在 @OrderBy 注释中包含 ASC,因为它默认是升序的。

仅更改内存中 List 中项目的顺序不会导致该顺序在提交时存储在数据库中。

注释仅在从数据库中检索到集合时适用。这意味着,订单不会存储在数据库中,但是当从数据库中检索数据并将其存储到内存中的 List 集合中时,它们将被排序。

@OrderColumn

OrderColumn 注释指定用于维护列表的持久顺序的列。示例:

@OrderColumn(name="ROOM_ORDER")
private List<Room> rooms;

这意味着您有一个名为“ROOM_ORDER”的附加列,它将指示您的项目在表中的顺序。

【讨论】:

    【解决方案2】:

    关系数据库不存储引用数据的顺序。为了将元素的顺序存储在列表中,JPA 需要 DB 表中的另一列。您可以使用与映射@JoinColumn 相同的方式将列映射到@OrderColumn(即使您使用了多个@JoinColumn 注释,您也只需要单个@OrderColumn

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 2015-04-27
      相关资源
      最近更新 更多