簡體   English   中英

Java Spring:(LinkedHash)映射中的枚舉鍵未排序

[英]Java Spring: Enum keys in (LinkedHash)Map are not ordered

我的實體Mealplan有一個作為 LinkedHashMap 的mealsPerWeek屬性。

@Entity
public class Mealplan {

@Id
private int id;

@ManyToMany
private Map<Weekday, Meal> mealsPerWeek = new LinkedHashMap<>();

public Map<Weekday, Meal> getMealsPerWeek() {
    return mealsPerWeek;
}

}

map 屬性的鍵是Weekday並且是一個枚舉:

public enum Wochentag {
    Monday, Tuesday, Wednesday, Thursday, Friday
}

現在我希望在我的 API 中,Meals 會以枚舉的正確順序顯示。 但它顯示得很隨機:

{
id: 1,
mealsPerWeek: {
  Tuesday: {
   id: 3,
   name: "Salad",
   preis: 3,
   art: "vegan"
},
  Monday: {
   id: 4,
   name: "Linsensuppe",
   preis: 23.5,
   art: "vegan"
},

如何在我的 REST API 中訂購它,以便它以正確的順序顯示鍵?

編輯:我在每次應用程序啟動時通過data.sql插入對象並意識到,每次訂單都是不同的。

源代碼: https://gitlab.com/joshua.olberg/java-spring-backend

問題是,當從數據庫加載 map(通常是所有集合)時,hibernate 使用自己的集合類型。

https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/domain/collections.ZFC35FDC70D5FC69D265883A822C7

Hibernate 使用自己的集合實現,這些實現豐富了延遲加載、緩存或 state 更改檢測語義。 因此,必須將持久性 collections 聲明為接口類型。 The actual interface might be java.util.Collection, java.util.List, java.util.Set, java.util.Map, java.util.SortedSet, java.util.SortedMap or even other object types (meaning you will have編寫 org.hibernate.usertype.UserCollectionType 的實現)。

如以下示例所示,使用接口類型而不是集合實現很重要,正如實體映射中聲明的那樣。

示例 1. Hibernate 使用自己的集合實現

@Entity(name = "Person") public static class Person { @Id private Long id; @ElementCollection private List<String> phones = new ArrayList<>(); public List<String> getPhones() { return phones; } } Person person = entityManager.find( Person.class, 1L ); //Throws java.lang.ClassCastException: org.hibernate.collection.internal.PersistentBag cannot be cast to java.util.ArrayList ArrayList<String> phones = (ArrayList<String>) person.getPhones();

所以:

private Map<Weekday, Meal> mealsPerWeek = new LinkedHashMap<>();

將被 PersistentMap 取代。 這就是使用 EnumMap 或 TreeMap 初始化 Map 失敗的原因。

您希望 Hibernate 使用 PersistentSortedMap,為此

  • 使用正確的接口SortedMap
  • 添加@SortNatural@SortComparator

EnumMap 可以在這里幫助你。 迭代順序基於枚舉中聲明的順序 - https://docs.oracle.com/javase/7/docs/api/java/util/EnumMap.ZFC35FDC70D5FC69D269883A822CA7

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM