我试图通过一个小例子来了解 Hibernate 中排序的工作原理。我创建了以下实体:
User.java
@Entity
@Table(name = "TB_USER")
public class User {
@Id
@GeneratedValue
private int id;
private String name;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "CUST_ID")
@Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
private SortedSet<Ticket> tickets = new TreeSet<Ticket>();
public User() {
}
public User(String name, Ticket...tickets) {
this.name = name;
this.tickets.addAll(Arrays.asList(tickets));
}
}
Ticket.java
@Entity
public class Ticket {
@Id
@GeneratedValue
private int id;
private String name;
}
比较器类:
public class TicketComparator implements Comparator<Ticket> {
public int compare(Ticket t1, Ticket t2) {
return t1.getName().compareTo(t2.getName());
}
}
测试这个的程序:
private static void saveUsers() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.getTransaction().begin();
User user = new User("User", new Ticket("abc"), new Ticket("xyz"));
session.save(user);
session.getTransaction().commit();
}
private static void showUsers() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.getTransaction().begin();
List<User> users = session.createQuery("from User").list();
for (User user : users) {
System.out.println(user.getName() + " -- > " + user.getTickets());
}
session.getTransaction().commit();
}
当我运行这个程序时,我收到异常:
Exception in thread "main" java.lang.ClassCastException: org.hibernate.tutorials.Ticket cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at java.util.AbstractCollection.addAll(Unknown Source)
at java.util.TreeSet.addAll(Unknown Source)
at org.hibernate.tutorials.hibernate7.five.sorted.User.<init>(User.java:37)
at org.hibernate.tutorials.hibernate7.five.sorted.AppTest.saveUsers(AppTest.java:33)
at org.hibernate.tutorials.hibernate7.five.sorted.AppTest.main(AppTest.java:11)
如果我已经提供了 comparator
属性,那么为什么 hibernate 没有选择我的比较器类而是抛出异常。如果我在此示例中遗漏了任何内容,请告诉我?
最佳答案
User user = new User("User", new Ticket("abc"), new Ticket("xyz"));
以上是纯Java代码,与Hibernate无关。您正在创建 User 类(不是 Hibernate)的实例,并用票证(不是 Hibernate)填充它。 TreeSet 初始化为
private SortedSet<Ticket> tickets = new TreeSet<Ticket>();
因此,您正在创建集合而不提供比较器。因此,该集合使用 Ticket 类的自然顺序进行排序。但 Ticket 没有实现 Comparable
,因此出现异常。
如果你要求 Hibernate 从数据库中获取一个用户,那么 Hibernate 将创建一个 User 实例,使用注释中提供的比较器将你的 TreeSet 替换为它自己的集合,并且你的票证将被正确排序。
关于java - @Sort 在 Hibernate 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25466392/