Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate不允许我处理错误凭据上的异常_Java_Oracle_Hibernate_Javafx_C3p0 - Fatal编程技术网

Java Hibernate不允许我处理错误凭据上的异常

Java Hibernate不允许我处理错误凭据上的异常,java,oracle,hibernate,javafx,c3p0,Java,Oracle,Hibernate,Javafx,C3p0,首先,我要说的是,我在这个问题上花了很多时间,却找不到任何有助于解决这个问题的文件。如果我错过了什么,我会提前道歉 我正在使用Eclipse和Hibernate 5.4以及JavaFX来管理一个桌面应用程序,该应用程序将要求用户以交互方式提供数据库凭据,并使用该信息覆盖Hibernate-cfg.xml文件上的属性。这部分工作正常。 当我想处理用户提供错误凭证的情况时,我的问题就出现了。看起来hibernate不允许我处理代码中使用的任何异常 有人能看一下并建议我应该在哪里改进,以便能够让我处理

首先,我要说的是,我在这个问题上花了很多时间,却找不到任何有助于解决这个问题的文件。如果我错过了什么,我会提前道歉

我正在使用Eclipse和Hibernate 5.4以及JavaFX来管理一个桌面应用程序,该应用程序将要求用户以交互方式提供数据库凭据,并使用该信息覆盖Hibernate-cfg.xml文件上的属性。这部分工作正常。 当我想处理用户提供错误凭证的情况时,我的问题就出现了。看起来hibernate不允许我处理代码中使用的任何异常

有人能看一下并建议我应该在哪里改进,以便能够让我处理这些问题吗

这是我的代码,我将尝试使用用户提供的信息构建sectionFactory。我希望处理task.setOnFailed上的错误凭据事件,但无论发生什么情况,都不会调用该事件task.setOnSucceeded始终被调用

    //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());}