@Sort在Hibernate中不起作用

时间:2014-08-23 21:06:52

标签: java hibernate

我试图通过一个小例子来理解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不会选择我的比较器类而是抛出异常。如果我在这个例子中遗漏了什么,请告诉我?

1 个答案:

答案 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>