You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Hibernate从SQLite表填充ObservableList为空问题求助

问题:Hibernate读取SQLite todo表数据为空,ObservableList无法填充

已确认SQLite的todo表存在有效数据,Hibernate Session已成功打开,但通过Hibernate查询数据并填充ObservableList时始终为空。以下是相关代码、配置及信息:

1. Main类核心查询代码

Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = null;
try {
    tx = session.beginTransaction();
    List<Task> tasks = session.createQuery("FROM Task").list();
    observableList.setAll(tasks);
    tx.commit();
} catch (HibernateException e) {
    if (tx != null) tx.rollback();
    e.printStackTrace();
} finally {
    session.close();
}

2. hibernate.cfg.xml配置

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.SQLiteDialect</property>
        <property name="hibernate.connection.driver_class">org.sqlite.JDBC</property>
        <property name="hibernate.connection.url">jdbc:sqlite:todo.db</property>
        <property name="hibernate.connection.username"></property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <mapping resource="TodoTask.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

3. TodoTask.hbm.xml映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.example.Task" table="todo">
        <id name="id" type="int">
            <column name="id"/>
            <generator class="native"/>
        </id>
        <property name="taskName" column="task_name"/>
        <property name="completed" column="completed"/>
        <!-- 其他属性映射 -->
    </class>
</hibernate-mapping>

4. Task类关键信息

  • 私有字段:private int id;、private String taskName;、private boolean completed;
  • 包含对应getter/setter方法
  • 需确保存在公共无参构造方法

5. 启动日志摘要

INFO: HHH000412: Hibernate ORM core version 5.6.14.Final
INFO: HHH000206: hibernate.properties not found
INFO: HHH000021: Bytecode provider name : javassist
INFO: HHH000040: Configuration resource: /hibernate.cfg.xml
INFO: HHH000041: Configured SessionFactory: null
INFO: HHH000227: Running hbm2ddl schema update
INFO: HHH000102: Fetching database metadata
INFO: HHH000397: Using ASTQueryTranslatorFactory

排查要点

  1. 映射与表字段匹配检查
    核对TodoTask.hbm.xml中<property>的column属性与SQLite todo表的实际字段名是否完全一致(SQLite大小写不敏感,但Hibernate映射需严格对应),比如表字段是taskname但映射写task_name会导致无法匹配。

  2. 实体类无参构造方法
    Hibernate要求实体类必须有公共无参构造方法,缺失会导致查询时无法实例化对象,最终返回空列表。

  3. HQL查询语句验证
    若使用FROM Task查询,需确保实体类类名(含包名)与映射文件<class>的name属性完全一致;也可尝试使用原生SQL查询session.createNativeQuery("SELECT * FROM todo", Task.class).list(),排查是否是HQL解析问题。

  4. SQLite方言与驱动兼容性
    确认SQLiteDialect版本与Hibernate版本匹配,部分旧版本方言存在查询适配问题;同时检查sqlite-jdbc驱动是否为最新版本。

  5. 数据库路径验证
    检查hibernate.connection.url中的数据库路径是否指向存有数据的todo.db文件——程序运行时可能在当前工作目录创建了新的空数据库,而非预期的已有数据文件。

  6. SQL语句直接验证
    开启hibernate.show_sql=true后,复制控制台输出的查询SQL到SQLite客户端执行:

    • 若SQL执行无结果:说明数据库路径错误或目标表无数据
    • 若SQL执行有结果但Hibernate返回空:说明映射或实体类存在问题

内容的提问来源于stack exchange,提问作者Tribjj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:35:20