使用Hibernate从SQLite表填充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
排查要点
映射与表字段匹配检查
核对TodoTask.hbm.xml中<property>的column属性与SQLite todo表的实际字段名是否完全一致(SQLite大小写不敏感,但Hibernate映射需严格对应),比如表字段是taskname但映射写task_name会导致无法匹配。实体类无参构造方法
Hibernate要求实体类必须有公共无参构造方法,缺失会导致查询时无法实例化对象,最终返回空列表。HQL查询语句验证
若使用FROM Task查询,需确保实体类类名(含包名)与映射文件<class>的name属性完全一致;也可尝试使用原生SQL查询session.createNativeQuery("SELECT * FROM todo", Task.class).list(),排查是否是HQL解析问题。SQLite方言与驱动兼容性
确认SQLiteDialect版本与Hibernate版本匹配,部分旧版本方言存在查询适配问题;同时检查sqlite-jdbc驱动是否为最新版本。数据库路径验证
检查hibernate.connection.url中的数据库路径是否指向存有数据的todo.db文件——程序运行时可能在当前工作目录创建了新的空数据库,而非预期的已有数据文件。SQL语句直接验证
开启hibernate.show_sql=true后,复制控制台输出的查询SQL到SQLite客户端执行:- 若SQL执行无结果:说明数据库路径错误或目标表无数据
- 若SQL执行有结果但Hibernate返回空:说明映射或实体类存在问题
内容的提问来源于stack exchange,提问作者Tribjj

