2016-11-23 96 views
0

我想测试休眠工作在我的项目中,为此我试图创建会话,并且IDEA告诉我org.hibernate.HibernateExceptionjava.lang.Throwable不兼容,并且我试图将其中一个施放到另一个也失败。项目是Java SE 8上的桌面应用程序,仅连接了hibernate-core-5.2.4.Finalhibernate-commons-annotations-5.0.1.Final库。 Main类:HibernateException和Throwable

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没有按” t支持正确的休眠,或者像这样smthng?

+0

请发布堆栈跟踪的异常 –

+0

我只是想知道为什么你会投掷'e =(Throwable)e;'。它总是给编译错误。 –

+0

如果他们不兼容,铸造将不会改变... – Antoniossss

回答

1

你不能这样做,因为当你在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(); 
    } 
} 

但是这种方法是多余的,我想你不想使用它。

+0

感谢您的合理评论 – Dmitresso

+0

@ДмитрийПеньковYou welolome! –

1

除了是一个可怕的想法,这失败了,因为你分配给自己。

因此,您有一个HibernateException类型的对象,您将其投射到Throwable(不需要,因为投射到更普通的类型是无用的)。

然后,您将此Throwable分配给HibernateException类型的变量。此时编译器会抱怨,因为您正在分配的东西可能与HibernateException不兼容(就他所知,在那一点上,它也可能是IllegalArgumentException例如,也可能是Throwable,但不是HibernateException)。

所以你不能指定。

如果你想修复代码,你最终会做 e = (HibernateException) e;这是更疯狂。

真正的问题是:你真的想在这里实现什么?

+0

我试图通过打开会话来测试连接。 IDEA要求处理异常,我试着用try/catch(我尝试不正确,但是这个方法总是显示不可转换的异常类型),试图将表达式添加到方法签名中,但问题仍然存在。我无法理解如何解决'org.hibernate.HibernateException'和'Throwable'是不可转换的,因为我找不到发生的原因。 – Dmitresso

+0

我不相信IDEA(我猜它的IntelliJ IDEA在说话)要求进行异常处理,因为'HibernateException'是未经检查的异常,编译器不会强制你捕捉或抛出它们。 – Ubercool

+0

如果你只是想忽略这个异常,那就去掉那一行,然后像你一样记录下错误。但是正如@Pramod所说的那样,“HibernateException”未被选中,所以不应该被需要。 –

1

这与Hibernate无关,而是Java中的一般概念。

catch (HibernateException e) { //fail 
     e = (Throwable)e; //fail 
     e.printStackTrace(); 
} 

的参考资料电子原是HibernateException类型和内部catch块你现在正在试图将它转换为它的父类Throwable这是不兼容的一个。

一般而言,如果您尝试这样做,它将会是ClassCastException,并且如果您尝试上传引用,那么编译时错误将无法将父对象分配给子引用。

+0

是的,我知道我错过了这里。为什么'HibernateException'不能正确处理?我已经导入了'org.hibernate.HibernateException',我找不到我的代码需要什么。 – Dmitresso

+0

你的意思是不能正确处理?我从你的代码中了解到,你正在捕获'HibernateException'并尝试打印'StackTrace'。您不需要将异常强制转换为'Throwable'来打印'StackTrace'。只需在catch块中有'e.printStackTrace();'语句,就完成了。 – Ubercool

+0

我刚刚创建了抛出'HibernateException'的方法,IDEA强调它,并且告诉:“不兼容的类型,需要'java.land.Throwable',找到'org.hibernate.HibernateException''这是引发quetions的事情。 – Dmitresso

0

我有完全相同的问题。事实证明,我错过了导入javax.persistence(就像你的情况一样)。

只需导入hibernate-jpa。在我的情况下,它是hibernate-jpa-2.1-api-1.0.0.Final.jar。

要导入相应的hibernate-jpa,只需使用Intellij中的“配置模块库”并选择“更改版本”即可。

相关问题