我正在尝试测试我的项目中的hibernate工作,因为我正在尝试创建会话,IDEA告诉我org.hibernate.HibernateException
和java.lang.Throwable
不兼容,我试图投一个另一个也失败了。 Project是Java SE 8上的桌面应用程序,仅连接了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?
答案 0 :(得分:2)
我遇到了完全相同的问题。事实证明,我错过了导入javax.persistence(似乎也是你的情况)。
也可以导入hibernate-jpa。就我而言,它是hibernate-jpa-2.1-api-1.0.0.Final.jar。
要导入适当的hibernate-jpa,您只需使用Intellij中的“配置模块库”,然后选择“更改版本”。
答案 1 :(得分:1)
您无法执行此操作,因为当您在e
块中声明变量时,变量HibernateException
的类型为catch
。
您需要使用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();
}
}
但这种方法多余,我认为你不想使用它。
答案 2 :(得分:1)
除了是一个糟糕的想法,这失败了,因为你将它分配给自己。
所以你有一个HibernateException
类型的对象,你将其转换为Throwable
(不是必需的,因为转换为更通用的类型是无用的)。
然后,您将此Throwable
分配给HibernateException
类型的变量。此时编译器会抱怨,因为您分配的内容可能与HibernateException
不兼容(对于他所知的所有内容,例如,它也可能是IllegalArgumentException
,也是{{1} },但不是Throwable
)。
所以你不能指定它。
如果您修复了该代码,您最终会这样做
HibernateException
这更加疯狂。
真正的问题是:你真正想要在这里实现什么目标?
答案 3 :(得分:1)
这与Hibernate无关,而是Java中的一般概念。
catch (HibernateException e) { //fail e = (Throwable)e; //fail e.printStackTrace(); }
引用e最初是HibernateException
类型,现在你正在尝试将它强制转换为不兼容的父类Throwable
之一。
通常,您不能将父对象分配给子引用,如果您尝试这样做,它将是ClassCastException
并且如果您尝试向上转换引用,则将是编译时错误。