2013-05-09 51 views
0

當[這可能是看到我的相關,但獨特的,從早期的今天Hibernate Schema Export in Eclipse問題是有用的。]奇怪NumberFormatException的Hibernate中使用的SessionFactory

我有以下的Java類

package com.examscam.model; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.AnnotationConfiguration; 
import org.hibernate.tool.hbm2ddl.SchemaExport; 

@Entity 
public class User { 
    private Long id; 
    private String password; 

    @Id 
    @GeneratedValue 
    public Long getId() { 
     return id; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public static void main(String[] args) { 
     AnnotationConfiguration config = new AnnotationConfiguration(); 
     config.addAnnotatedClass(User.class); 
     config.configure(); 
//  new SchemaExport(config).create(true, true); 

     SessionFactory factory = config.buildSessionFactory(); 
     Session session = factory.getCurrentSession(); 
     session.beginTransaction(); 

     User u = new User();   
     u.setPassword("abc123"); 

     session.saveOrUpdate(u); 
     session.getTransaction().commit(); 

     System.out.println("Done."); 
    } 
} 

我有一(MySQL的)數據庫,並創建了用戶表的代碼

create table User (id integer not null auto_increment, password varchar(255), primary key (id)) 

然而,當我嘗試運行此代碼,我給下面的堆棧TRAC User類電子

Exception in thread "main" java.lang.NumberFormatException: For input string: "" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
    at java.lang.Integer.parseInt(Integer.java:470) 
    at java.lang.Integer.valueOf(Integer.java:554) 
    at org.hibernate.util.PropertiesHelper.getInteger(PropertiesHelper.java:37) 
    at org.hibernate.connection.DriverManagerConnectionProvider.configure(DriverManagerConnectionProvider.java:47) 
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124) 
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56) 
    at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:414) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292) 
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859) 
    at com.examscam.model.User.main(User.java:40) 

線40

SessionFactory factory = config.buildSessionFactory(); 

任何人都不會有爲什麼發生這種情況的任何想法?我沒有在該行的任何地方輸入一個空字符串,並且已經從該書中完全複製了代碼。我毫不懷疑這本書是正確的;我的問題更多的是'任何人都可以想到任何原因(xml文件中的錯誤,classpath排序問題,文件不在正確的目錄中等等)爲什麼會發生這種行爲?'。

此問題的答案也可能有助於解決導出架構時本頁頂部鏈接中的問題。

謝謝Conor。

回答

1

所以我相信我已經解決了這個問題,最終成爲兩個問題。首先,在classpath中有另一個更老的hibernate副本。此舊版本需要不再需要的配置元素,導致NumberFormatException,因爲它試圖將空字符串解析爲缺少事務隔離配置元素的int。

固定在此之後,我們開始看到NullPointerException在這行代碼:

Environment.class.getClassLoader().getResourceAsStream(stripped); 

望着那行代碼,這可能已經被拋NPEgetClassLoader調用的唯一的事,但這怎麼可能是空的?事實證明,如果返回的類加載器是引導類加載器,則getClassLoader可以返回null。我問Conor檢查他是否把冬眠放入引導類路徑,結果證明他做到了。從引導類中刪除它解決了問題。

所以兩個教訓在這裏:

  1. 精心管理類路徑。知道它上面有什麼,並儘可能保持修剪。第三方庫存越少越好。
  2. 永遠不要在引導類路徑上放東西。如果你決定忽略這條規則,那麼明白潛在的含義是什麼,所以你不會陷入這樣的問題。
+0

我在頁面上提供了hibernate.cfg.xml的完整條目,我在帖子的頂部鏈接了它,但它只包含hibernate.connection.url,hibernate.connection.username,hibernate.connection.password,hibernate。 connection.driver_class,hibernate.dialect,hibernate.transaction.factory_class,hibernate.current_session_context_class和hibernate.show_sql。再次,我已經完全按照書中的內容複製了該代碼。話雖如此,它已經略顯過時。你能想到我需要的任何東西嗎?我今天早上下載了所有的hibernate jar,所以它應該是最新的版本。 – ConorW 2013-05-09 17:53:29

+0

休眠的確切版本在這裏很重要,因爲它告訴我要查看哪些源代碼。你能給我確切的版本嗎? – cmbaxter 2013-05-09 17:58:10

+0

我使用的hibernate核心是hibernate-core-4.2.0.Final.jar。那是你需要的嗎?[我是一個新手]? – ConorW 2013-05-09 18:00:10

0

數據庫ID列的數據類型是整數,但實體類的ID數據類型很長,不確定這是否是問題。 但值得嘗試將實體ID的數據類型更改爲int。

+0

我明白你的意思,我把Long改爲Integer,但我仍然得到一個NumberFormatException,所以我想不是這樣。不管怎麼說,還是要謝謝你。 – ConorW 2013-05-09 17:54:56

相關問題