Java 使用错误凭据登录时无法捕获休眠异常

Java 使用错误凭据登录时无法捕获休眠异常,java,database,hibernate,exception,Java,Database,Hibernate,Exception,我正在用Hibernate做一个Java项目。这是我登录数据库的代码: 1 public static void connect(String username, String password) throws Exception 2 { 3 Configuration cfg = new Configuration(); 4 cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL

我正在用Hibernate做一个Java项目。这是我登录数据库的代码:

1    public static void connect(String username, String password) throws Exception
2    {
3        Configuration cfg = new Configuration();
4        cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
5        cfg.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
6        cfg.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/Scheme");
7        cfg.setProperty("hibernate.connection.username", username);
8        cfg.setProperty("hibernate.connection.password", password);
9
10        cfg.addResource("model/Classroom.hbm.xml");
11        cfg.addResource("model/Classteacher.hbm.xml");
12        cfg.addResource("model/Education.hbm.xml");
13        cfg.addResource("model/Lesson.hbm.xml");
14        cfg.addResource("model/Loginauth.hbm.xml");
15        cfg.addResource("model/Schoolclass.hbm.xml");
16        cfg.addResource("model/Semester.hbm.xml");
17        cfg.addResource("model/Semestersubject.hbm.xml");
18        cfg.addResource("model/Student.hbm.xml");
19        cfg.addResource("model/Subject.hbm.xml");
20        cfg.addResource("model/Teacher.hbm.xml");
21        cfg.addResource("model/Login.hbm.xml");
22        sessionFactory = cfg.buildSessionFactory();
23    }
如果我使用了错误的用户名/密码,则会出现以下异常:

java.sql.SQLException: Access denied for user 'root1'@'localhost' (using password: YES)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:943)
at com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:4113)
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1308)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2336)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2369)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
at java.sql.DriverManager.getConnection(DriverManager.java:579)
at java.sql.DriverManager.getConnection(DriverManager.java:190)
at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:110)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:84)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)
at util.HibernateUtil.connect(HibernateUtil.java:22) <-- Line 22 at the above code
at core.LoginWindow$5.run(LoginWindow.java:199)

在上述代码的第22行和第23行之间。

抛出的异常实际上不是“未捕获”异常,而是将其记录在我无法到达的某个位置。它缺少这一部分:

Exception in thread "AWT-EventQueue-0"
我使用的是Hibernate3,但升级到了4。然后将buildSessionFactory()方法更改为:。 现在,如果我提供了错误的凭据,我不会得到记录的异常


问题解决了,爱你们所有人。

事实上,测试查询根本不是一个肮脏的黑客行为。虽然它可以更一般,例如SELECT 1。我建议您将配置外部化到配置文件中,并添加一些池机制,例如C3P0@heikkim“选择1”也适用。尽管它仍然抛出不可修补的异常。之后程序仍然运行,所以我想这无关紧要。我使用了配置对象,因为我不希望用户名和密码最终放在.Jar中的纯文本文件中。我将研究C3P0。您捕获了哪个异常?如果无法捕获该异常,则听起来它好像被捕获并记录在其他位置,而不是被重新捕获。除此之外,我还了解到buildSessionFactory()已被弃用,请查看此选项以寻找替代方案。如果数据库配置属性有任何问题,则会在方法的最后一行buildSessionFactory()生成异常。也许这就是为什么你认为这个方法是正确的。
Exception in thread "AWT-EventQueue-0"