2015-10-14 89 views
1

当我坚持一个包含订单的清单时,数据库中的结果具有不同的顺序。如何在JPA中保持与列表顺序的多对多关系?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" 
+2

数据库记录没有“订单”。 – Jens

+0

什么是'seq'? – user902383

+0

已更正。我的错误 – sina

回答

3

有2种方式订购列表中使用JPA和@OrderBy @OrderColumn注释。 @OrderColumn也许就是你要找的。

@OrderBy

指定基于该实体或元件

实施例的一个特定属性的比较的排序规则:

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

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

只需更改内存中列表中的项目顺序,不会导致在提交时将该订单存储在数据库中。

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

@OrderColumn

的OrderColumn注释指定用于保持列表的所述持久顺序的柱。示例:

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

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

0

关系数据库不存储引用的数据的顺序。为了将元素的顺序存储在列表中,JPA需要DB表中的另一列。您可能会列在同一方式@OrderColumn地图,你映射@JoinColumn(你只需要单@OrderColumn,甚至当你使用多个@JoinColumn注释)