Hibernate не позволяет мне обрабатывать исключения на неправильные учетные данные - PullRequest
0 голосов
/ 09 февраля 2020

Позвольте мне начать с того, что я старался много смотреть на эту тему и не смог найти ни одного документа, который бы помог по этому вопросу. Я заранее извиняюсь, если что-то пропустил.

Я использую Eclipse с Hibernate 5.4 и JavaFX для управления настольным приложением, которое попросит пользователя предоставить учетные данные базы данных в интерактивном режиме и использовать эту информацию для переопределения свойства в файл hibernate-cfg. xml. Эта часть полностью работает. Моя проблема возникает, когда я хочу обработать очень вероятный сценарий, когда пользователь предоставит неверные учетные данные. Похоже, что hibernate не позволяет мне обрабатывать какие-либо исключения, которые я использую в своем коде.

Может кто-нибудь посмотреть и предложить, где я должен улучшить, чтобы иметь возможность разрешать эти проблемы?

Это мой код, в котором я постараюсь построить раздел Factory с информацией, предоставленной пользователем. Я надеялся обработать событие неправильных учетных данных в 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();
}

Это опять мой класс построителя sessionFactory, опять же исключение catch там никогда не вызывается.

    public static SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
        try {

            //Create the config file / legacy but still works
            Configuration hibernateConfig = new Configuration().configure(new File(Paths.get("").toAbsolutePath().toString() + "\\Config\\hibernate.cfg.xml"));
            hibernateConfig.setProperty("hibernate.connection.username", getUsername());
            hibernateConfig.setProperty("hibernate.connection.password", getPassword());

            // Creating a registry
            //registry = new StandardServiceRegistryBuilder().configure(new File(Paths.get("").toAbsolutePath().toString() + "\\Config\\hibernate.cfg.xml")).build();
            registry = new StandardServiceRegistryBuilder().applySettings(hibernateConfig.getProperties()).build();

            // Create the MetadataSources
            MetadataSources sources = new MetadataSources(registry);
            sources.addAnnotatedClass(Class1.class);
            sources.addAnnotatedClass(Class2.class);

            // Create the Metadata
            Metadata metadata = sources.getMetadataBuilder().build();

            // Create SessionFactory
            sessionFactory = metadata.getSessionFactoryBuilder().build();

        } catch (Exception e) {
            e.printStackTrace();

            if (registry != null) {
                StandardServiceRegistryBuilder.destroy(registry);
            }
        }
    }

    return sessionFactory;
}

Ниже приводится ошибка, с которой я столкнулся в 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>

...