HibernateException和Throwable

时间:2016-11-23 09:07:27

标签: java hibernate

我正在尝试测试我的项目中的hibernate工作,因为我正在尝试创建会话,IDEA告诉我org.hibernate.HibernateExceptionjava.lang.Throwable不兼容,我试图投一个另一个也失败了。 Project是Java SE 8上的桌面应用程序,仅连接了hibernate-core-5.2.4.Finalhibernate-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?

4 个答案:

答案 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并且如果您尝试向上转换引用,则将是编译时错误。