【问题标题】:Strange NumberFormatException in Hibernate When Using SessionFactory使用 SessionFactory 时 Hibernate 中出现奇怪的 NumberFormatException
【发布时间】:2013-05-04 06:37:49
【问题描述】:

[今天早些时候在这里Hibernate Schema Export in Eclipse查看我的相关但独特的问题可能很有用。]

我有以下 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))

但是,当我尝试运行此代码时,我得到了以下堆栈跟踪

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)

User 类的第 40 行是

    SessionFactory factory = config.buildSessionFactory();

有人知道为什么会这样吗?我没有在该行的任何地方输入空字符串,并且我已经完全从书中复制了代码。我毫不怀疑这本书是正确的;我的问题更多的是“谁能想到任何原因(xml 文件中的错误、类路径排序问题、文件不在正确的目录中等)为什么会发生这种行为?”。

对这个问题的回答也可能有助于解决此页面顶部链接中导出架构的问题。

谢谢,康纳。

【问题讨论】:

    标签: java mysql database eclipse hibernate


    【解决方案1】:

    所以我相信我已经解决了这个问题,最终成为两个问题。首先,在类路径中有另一个较旧的 hibernate 副本。这个旧版本需要不再需要的配置元素,导致NumberFormatException 因为它试图将空字符串解析为缺少事务隔离配置元素的 int。

    修复之后,我们开始在这行代码中看到NullPointerException

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

    看看那行代码,唯一可以抛出NPE 的是getClassLoader 调用,但它怎么可能是空的呢?事实证明,如果返回的类加载器是引导类加载器,getClassLoader 可以返回 null。我让 Conor 检查他是否将 hibernate 放入了引导类路径,结果证明他做到了。从引导类中删除它解决了这个问题。

    这里有两节课:

    1. 仔细管理您的课程路径。知道上面有什么,并尽可能保持整洁。第三方库越少越好。
    2. 永远不要把东西放在引导类路径上。如果您决定忽略此规则,请了解潜在影响是什么,这样您就不会被此类问题困扰。

    【讨论】:

    • 我在帖子顶部链接到的页面上提供了 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,所以应该是最新版本。
    • hibernate 的确切版本在这里很重要,因为它告诉我要查看哪些源代码。你能给我确切的版本吗?
    • 我使用的hibernate核心是hibernate-core-4.2.0.Final.jar。这就是你需要的[我是个新手]?
    • 这很有帮助!谢谢!很高兴知道问题的根源。我查看了我的类路径,并且还有其他休眠 jar 看起来可能是违规者(特别是 hibernate3.jar 似乎很可疑 - 我正在使用的书特别提到了它,但是当注释不包含在休眠中时,这又回来了核心,所以我不得不在某个地方即兴发挥一点,这显然没有完美地工作);我已将 hibernate-core-4.2.0.Final.jar 提升到我的类路径的顶部。现在这会产生一个不同的异常,我将在下面详细说明。
    • 线程“主”org.hibernate.HibernateException 中的异常:无法解析配置:org.hibernate.cfg.Configuration.doConfigure(Configuration.java:2023) 中的 /hibernate.cfg.xml .hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:201) 在 org.hibernate.cfg.AnnotationConfiguration.doConfigure(AnnotationConfiguration.java:46) 在 org.hibernate.cfg.Configuration.configure(Configuration.java:1935) 在org.hibernate.cfg.AnnotationConfiguration.configure(AnnotationConfiguration.java:183)
    【解决方案2】:

    数据库id列的数据类型是整数,但是实体类的id数据类型是长的,不知道是不是这个问题。 但值得尝试将实体 id 的数据类型更改为 int。

    【讨论】:

    • 我明白你的意思,我在适当的地方将 Long 更改为 Integer,但我仍然得到 NumberFormatException,所以我想不是这样。还是谢谢。
    猜你喜欢
    • 2014-09-24
    • 2012-03-19
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2021-03-31
    • 2013-05-05
    相关资源
    最近更新 更多