2012-11-19 53 views
0

我正在用Hibernate製作Java項目。這是我記錄在數據庫中的代碼:在登錄時出現錯誤憑據無法捕獲Hibernate異常

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) 

無論我有多少的try/catch和投擲用的方法仍然正確返回。 我唯一的解決方法是添加這一行,但它更像是一個「黑客修復」而不是真正的修復。

Query q = session.createQuery("from Student"); 
q.list(); 

在上述代碼中的第22行和第23行之間。

+2

實際上,測試查詢根本不是骯髒的破解。雖然它可能更通用,比如SELECT 1.我建議你將配置文件外部化到配置文件並添加一些池機制,如C3P0 – heikkim

+0

@heikkim「select 1」也適用。雖然它仍然拋出不可捕捉的異常。該程序仍然運行後,所以我想這沒關係。我使用了Configuration對象,因爲我不希望用戶名和密碼在最後打包在.Jar中的純文本文件中。我會研究C3P0。 –

+0

你發現了哪個異常? – Suranga

回答

0

拋出的異常確實不是「未捕獲」的異常,而只是將其記錄到某處我無法觸及的地方。它缺少這一部分:

Exception in thread "AWT-EventQueue-0" 

我使用Hibernate 3,但升級到4。然後改變buildSessionFactory()方法來這樣:Is buildSessionFactory() deprecated in hibernate 4?。 現在,如果我提供了錯誤的憑據,我不會收到記錄的異常。

問題解決了,全部愛你。