java - 使用 SessionFactory 时 Hibernate 中的奇怪 NumberFormatException

标签 java mysql database eclipse hibernate

[今天早些时候在这里查看我相关但又不同的问题可能会很有用 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 文件中的错误、类路径排序问题、文件不在正确的目录中等)为什么会发生这种行为?”。

此问题的答案也可能有助于解决本页顶部链接中导出架构的问题。

谢谢,康纳。

最佳答案

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

修复该问题后,我们开始在这行代码上看到 NullPointerException:

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

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

这里有两个教训:

  1. 仔细管理你的类(class)路径。了解上面的内容并尽可能保持简洁。第三方库越少越好。
  2. 永远不要把东西放在启动类路径上。如果您决定忽略此规则,请了解潜在的影响,这样您就不会陷入追寻此类问题的困境。

关于java - 使用 SessionFactory 时 Hibernate 中的奇怪 NumberFormatException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16467659/

相关文章:

php - 使用 Where 子句插入

python - 在 Django 中连接与查询集中记录的多行相关的字段

sql - 如何在大型数据库的 sqlite 中为数据表行分配索引?

database - 约束为数据库提供了哪些优势?

sql - 学习如何编写复杂的存储过程

java - 如何判断坐标点是否为负值

JavaFXPorts MySqlDB-Driver 包含在项目 :dex error 中

php - mysql计算每个指定的单词数

java - 为什么我的 @BeforeClass 方法没有运行?

java - 如果 select 语句包含 DATE 类型的列,则聚合 SQL 查询不起作用