我有一对实体,大师和学徒,一个大师可以有多个学徒。
我需要从主数据库读取时,padawans 字段应按年龄字段排序:
@Entity
@NoArgsConstructor
@Getter
@Setter
public class Master {
@Id
@GenericGenerator(name = "uuid", strategy = "uuid2")
@GeneratedValue(generator = "uuid")
private String id;
private String name;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@OrderBy("age")
private List<Padawan> padawans = new ArrayList<>();
public Master(String name) {
this.name = name;
}
}
@Entity
@NoArgsConstructor
@Getter
@Setter
public class Padawan {
@GeneratedValue
@Id
private int id;
private String name;
public int age;
public Padawan(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Padawan{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
以及我从中启动的课程本身:
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("myUnit");
EntityManager entityManager = factory.createEntityManager();
Master master = new Master("Kwigon Jeen");
Padawan padawan1 = new Padawan("Obi One", 15);
Padawan padawan2 = new Padawan("Lee", 19);
Padawan padawan3 = new Padawan("Ganz", 13);
Collections.addAll(master.getPadawans(), padawan1, padawan2, padawan3);
entityManager.getTransaction().begin();
entityManager.persist(master);
entityManager.getTransaction().commit();
factory.getCache().evictAll();
Master res;
entityManager.getTransaction().begin();
res = entityManager.find(Master.class, master.getId());
entityManager.getTransaction().commit();
res.getPadawans().stream().forEach(padawan -> System.out.println(padawan));
entityManager.close();
factory.close();
}
但问题是,padawans 的列表是未排序的。
Padawan{id=1, name='Obi One', age=15} Padawan{id=2, name='Lee', age=19} Padawan{id=3, name='Ganz', age=13}
ps
1)我试图完全删除龙目岛
2)尝试将输出循环从流更改为foreach:
for (Padawan p : res.getPadawans()){
System.out.println(p);
}
3) 将输出循环更改为 foreachOrdered
res.getPadawans().stream().forEachOrdered(padawan -> System.out.println(padawan));
问题是您试图在清除二级缓存时获取已经在一级缓存中的排序列表。Hibernate 不关注缓存中列表的排序顺序,它只关心它的存在以便不形成对数据库的查询(@OrderBy 注解仅在接收数据时影响顺序)。因此,要生成查询并获得排序列表,您可以清除一级缓存:
或从上下文中分离对象:
或重新创建上下文: