我正在尝试编写我的第一个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();
}
}
此代码中是否有任何错误?
答案 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
。因为,
我在类HibernateSession
中没有看到任何实例变量,因此没有必要使用静态变量和方法返回类的对象,实际上这应该是你拥有一个该类的private
构造函数。
您始终可以使用beginTransaction()
方法获取当前事务。 javadoc说,
...如果需要新的基础交易,请开始交易。否则,在现有基础交易的上下文中继续新工作......
所以我建议你改变你的方法,
public static Session getHSConnection() {
...
return session;
}
当您需要提交交易时,
Session s = HibernateSession.getHSConnection();
s.beginTransaction().commit();
请记住,一切都取决于您的要求。