运行jsp时无法强制转换为hibernate.HibernateSession

时间:2018-05-15 21:48:51

标签: java hibernate

我正在尝试编写我的第一个Hibernate项目。但我有一个例外。

  

java.lang.ClassCastException:   org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction无法强制转换为hibernate.HibernateSession

这就是我编写会话方法的方法。

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

public class HibernateSession {

    static Connection.NewHibernateUtil hibernateutil;
    static SessionFactory sessionfactory;
    static Session session;
    static Transaction transaction;

    private HibernateSession() {
    }

    public static HibernateSession getHSConnection() {
        if (transaction == null) {
            session = Connection.NewHibernateUtil.getSessionFactory().openSession();
            transaction = session.beginTransaction();
        }
        return (HibernateSession) transaction;
    }

    public static void closeHSConnection() {
        if (transaction != null) {
            session.flush();
            transaction.commit();
        }
        session.close();
    }
}

此代码中是否有任何错误?

2 个答案:

答案 0 :(得分:3)

当它是一个完全不同的类(JDBCTransaction)的实例时,你不能将一个对象强制转换为你的类

  return (HibernateSession) transaction; // this is the error

答案 1 :(得分:1)

this answer Joakim的解释是完美的。

根据您的真实需要,您有几个选择。

  • 如果您需要HibernateSession个对象(您编写的类中的对象),请将getHSConnection()的return语句更改为,

    return new HibernateSession();
    
  • 或者,如果您需要新创建的org.hibernate.Transaction,请更改您的方法

    public static Transaction getHSConnection() {
        ...
        return transaction;
    }
    

但我建议你不应该返回那些。返回org.hibernate.Session。因为,

  1. 我在类HibernateSession中没有看到任何实例变量,因此没有必要使用静态变量和方法返回类的对象,实际上这应该是你拥有一个该类的private构造函数。

  2. 您始终可以使用beginTransaction()方法获取当前事务。 javadoc说,

      

    ...如果需要新的基础交易,请开始交易。否则,在现有基础交易的上下文中继续新工作......

  3. 所以我建议你改变你的方法,

    public static Session getHSConnection() {
        ...
        return session;
    }
    

    当您需要提交交易时,

    Session s = HibernateSession.getHSConnection();
    s.beginTransaction().commit();
    

    请记住,一切都取决于您的要求。