我正在尝试在我的项目中测试hibernate的工作,因此我试图创建session,IDEA告诉我org.hibernate.HibernateException和java.lang.Throwable是不兼容的,我尝试将一个转换为另一个也失败了。该项目是JavaSE8上的桌面应用程序,只连接了hibernate-core-5.2.4.Final和hibernate-commons-annotations-5.0.1.Final库。Main类:
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class Main {
public static void main(String[] args) throws Exception {
try {
SessionFactory session;
session = new Configuration().configure().buildSessionFactory();
session.openSession();
} catch (HibernateException e) { //fail
e = (Throwable)e; //fail
e.printStackTrace();
}
}
}这是hibernate.cfg
<hibernate-configuration>
<session-factory>
<property name=«show_sql»>true</property>
<property name=«connection.url»>jdbc:sqlite://db/DB.db</property>
<property name=«connection.driver_class»>org.sqlite.jdbc</property>
<property name=«connection.username»>root</property>
<property name=«connection.password»/>
<property name=«connection.pool_size»>1</property>
<property name=«current_session_context_class»>thread</property>
<property name=«dialect»>main.java.SQLiteDialect</property>
<!--> there're some mapping resouces
<mapping resource=«logic/File.hbm.xml»/>
<-->
</session-factory>
</hibernate-configuration>我不明白这个错误的原因,因为谷歌显示了以下层次:
java.lang.Object
└extended by java.lang.Throwable
└extended by java.lang.Exception
└extended by java.lang.RuntimeException
└extended by org.hibernate.HibernateException也许Java 8不能正确支持hibernate,或者像这样smthng?
发布于 2017-03-24 16:50:57
我也遇到了同样的问题。事实证明,我错过了导入javax.persistence (似乎您的情况也是如此)。
只需导入hibernate-jpa即可。在我的例子中,它是hibernate-jpa-2.1-api-1.0.0.Final.jar。
要导入适当的hibernate-jpa,您只需使用Intellij中的“配置模块库”并选择“更改版本”即可。
发布于 2016-11-23 17:15:45
您不能这样做,因为当您在catch块中声明变量e时,它的类型为HibernateException。
您需要创建具有Throwable类型的新变量,并将强制转换e变量分配给它,如下所示:
} catch (HibernateException e) {
Throwable ex = (Throwable)e;
ex.printStackTrace();
}最好的方法是wrapping exception,如下所示:
} catch (HibernateException e) {
Throwable ex = new Throwable(e);
ex.printStackTrace();
}或者这样做:
} catch (HibernateException e) {
try {
throw (Throwable) e;
} catch (Throwable ex) {
ex.printStackTrace();
}
}但是这个方法是多余的,我想你不会想用这个的。
发布于 2016-11-23 17:21:32
这不仅是一个糟糕的想法,而且失败了,因为你把它赋给了它自己。
因此,您有一个类型为HibernateException的对象,可以将其强制转换为Throwable (不是必需的,因为强制转换为更通用的类型是无用的)。
然后将此Throwable赋值给HibernateException类型的变量。在这一点上,编译器会抱怨,因为你赋值的东西可能与HibernateException不兼容(据他所知,它也可能是IllegalArgumentException,也可能是Throwable,但不是HibernateException)。
所以你不能分配它。
如果你修复了这些代码,你最终会去做e = (HibernateException) e;,这甚至更疯狂。
真正的问题是:你在这里真正想要实现的是什么?
https://stackoverflow.com/questions/40760061
复制相似问题