我试图通过一个小例子来理解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不会选择我的比较器类而是抛出异常。如果我在这个例子中遗漏了什么,请告诉我?
答案 0 :(得分:1)
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,使用注释中提供的比较器,你的票证将被正确排序。 / p>