[英]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
插入對象並意識到,每次訂單都是不同的。
問題是,當從數據庫加載 map(通常是所有集合)時,hibernate 使用自己的集合類型。
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.