2015-10-14 88 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註釋)