JPA:如何在多对多关系中保存包含订单的列表

sin*_*ina 4 java many-to-many jpa eclipselink

当我持有具有订单的列表时,数据库中的结果具有不同的顺序.如何在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;
}
Run Code Online (Sandbox Code Playgroud)

房子对象:

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"
Run Code Online (Sandbox Code Playgroud)

Ish*_*Ish 6

有两种方法可以使用@OrderBy和@OrderColumn注释在JPA中排序列表.@OrderColumn也许就是你要找的东西.

@OrderBy

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

例:

@OrderBy("name ASC")
private List<Room> rooms;
Run Code Online (Sandbox Code Playgroud)

通过在映射上添加@OrderBy注释,我们可以指示我们希望房间按名称属性按字母顺序升序排序.注意:我们不需要在@OrderBy注释中包含ASC,因为默认情况下它会升序.

简单地更改内存中List的项目顺序不会导致该命令在提交时存储在数据库中.

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

@OrderColumn

OrderColumn批注指定用于维护列表的持久顺序的列.例:

@OrderColumn(name="ROOM_ORDER")
private List<Room> rooms;
Run Code Online (Sandbox Code Playgroud)

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