Java Hibernate不允许我处理错误凭据上的异常
首先,我要说的是,我在这个问题上花了很多时间,却找不到任何有助于解决这个问题的文件。如果我错过了什么,我会提前道歉 我正在使用Eclipse和Hibernate 5.4以及JavaFX来管理一个桌面应用程序,该应用程序将要求用户以交互方式提供数据库凭据,并使用该信息覆盖Hibernate-cfg.xml文件上的属性。这部分工作正常。 当我想处理用户提供错误凭证的情况时,我的问题就出现了。看起来hibernate不允许我处理代码中使用的任何异常 有人能看一下并建议我应该在哪里改进,以便能够让我处理这些问题吗 这是我的代码,我将尝试使用用户提供的信息构建sectionFactory。我希望处理task.setOnFailed上的错误凭据事件,但无论发生什么情况,都不会调用该事件task.setOnSucceeded始终被调用Java Hibernate不允许我处理错误凭据上的异常,java,oracle,hibernate,javafx,c3p0,Java,Oracle,Hibernate,Javafx,C3p0,首先,我要说的是,我在这个问题上花了很多时间,却找不到任何有助于解决这个问题的文件。如果我错过了什么,我会提前道歉 我正在使用Eclipse和Hibernate 5.4以及JavaFX来管理一个桌面应用程序,该应用程序将要求用户以交互方式提供数据库凭据,并使用该信息覆盖Hibernate-cfg.xml文件上的属性。这部分工作正常。 当我想处理用户提供错误凭证的情况时,我的问题就出现了。看起来hibernate不允许我处理代码中使用的任何异常 有人能看一下并建议我应该在哪里改进,以便能够让我处理
//Task to connect to DB
private void taskDBConnection() {
// Create a background Task
Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
actionTarget.setText("Attempt to login to database");
HibernateUtil.getSessionFactory();
return null;
}
};
// This method allows us to handle any Exceptions thrown by the task
task.setOnFailed(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent arg0) {
System.out.println("Failed LoginView.java setOnFailed");
task.getException().printStackTrace();
}
});
// If the task completed successfully, perform other updates here
task.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent arg0) {
System.out.println("Done LoginView.java setOnSucceeded");
loginStage.close();
}
});
// Now, start the task on a background thread
new Thread(task).start();
}
下面是我在Eclipse上遇到的错误。它相当长,所以我将只发布第一部分。当然,我知道异常是什么(我强制它发生),但我希望以一种方式处理它,即用户将被通知他们不正确,并允许他们重试
WARNING: com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@87315ad -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (1). Last acquisition attempt exception:
java.sql.SQLException: ORA-01017: invalid username/password; logon denied
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:392)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:385)
at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:1018)
at oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:501)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:437)
at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:954)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:639)
at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:666)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:566)
at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:175)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:220)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:206)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:203)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125)
at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44)
at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
和hibernate.cfg.xml
<session-factory>
<property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@database:1521:schema</property>
<property name="dialect">org.hibernate.dialect.Oracle8iDialect</property>
<property name="show_sql">true</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">1800</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.acquireRetryAttempts">1</property>
<property name="hibernate.c3p0.acquireRetryDelay">2500</property>
</session-factory>
oracle.jdbc.OracleDriver
jdbc:oracle:thin:@database:1521:schema
org.hibernate.dial.Oracle8iDialect
真的
5.
20
1800
50
1.
2500
如果有人好奇,我设法让它或多或少地发挥作用,方法是隐藏抛出的任何异常,并在应用程序的标签中打印此消息。
我总是通过使用Optional迭代trought来获得根异常,因此当它是错误的凭证时,JDBC将给出这个结果
catch (Exception e) {
Optional<Throwable> rootCause = Stream.iterate(e, Throwable::getCause)
.filter(element -> element.getCause() == null)
.findFirst();
System.out.println(rootCause.get().getClass().getSimpleName() + " - " + rootCause.get().getMessage());}
catch(异常e){
可选的rootCause=Stream.iterate(e,Throwable::getCause)
.filter(element->element.getCause()==null)
.findFirst();
System.out.println(rootCause.get().getClass().getSimpleName()+“-”+rootCause.get().getMessage());}
您正在sessionFactory中捕获一个异常,那么调用者如何知道有错误?不确定我是否完全理解您的问题,但我不会在任何地方捕获此异常。
catch (Exception e) {
Optional<Throwable> rootCause = Stream.iterate(e, Throwable::getCause)
.filter(element -> element.getCause() == null)
.findFirst();
System.out.println(rootCause.get().getClass().getSimpleName() + " - " + rootCause.get().getMessage());}