运行程序后文件数据库中没有模式通过休眠持久化到 hsqldb:file

Posted

技术标签:

【中文标题】运行程序后文件数据库中没有模式通过休眠持久化到 hsqldb:file【英文标题】:No schema in file database after running program persisted to hsqldb:file via hibernate 【发布时间】:2012-10-28 20:58:59 【问题描述】:

这里是hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.connection.url">jdbc:hsqldb:file:test_db_file</property>
    <property name="hsqldb.write_delay">false</property>
    <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
    <property name="dialect">org.hibernate.dialect.HSQLDialect</property>
    <property name="hibernate.connection.username">combine1</property>
    <property name="hibernate.connection.password"></property>

    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>
    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>
    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">create</property>
    <!--
         few resources
    -->

  </session-factory>
</hibernate-configuration>

当我将 hsqldb 更改为 mysql db 时,它工作正常。但是当我这样离开时,我将 hsqldb:file 作为 NetBeans 中的数据库连接时,公共模式中没有任何内容,我想在运行程序后找到创建的表。

在运行时,类是持久化的,我可以从会话等中加载它们,但程序结束后,什么都没有。除了 test_db_file.script 是创建所需模式的查询,但不是我保存到数据库中的行。

这是我写的简单的主要内容,当我使用一些 mysql 数据库时,它可以工作:

import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import resources.HibernateUtil;
import website.Website;

public class MrhAdministration 

  public static void main(String[] args) 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    WebsiteCreator.create(session);

    Criteria criterial = session.createCriteria(Website.class);
    for (Website w : (List<Website>) criterial.list()) 
      System.out.println("Sites: " + w.getSiteName() + " " + w.getSiteUrl());
    
    session.getTransaction().commit();
  

感谢您的回答!

【问题讨论】:

【参考方案1】:

最可能的问题是数据库文件的位置。您正在使用相对路径jdbc:hsqldb:file:test_db_file,当您使用不同的程序访问数据库时,它会解析到不同的位置。试试绝对路径,例如jdbc:hsqldb:file:/db/test_db_file

请注意,您对 username 和 write_delay 的其他设置适用于最新版本 2.2.x 及更高版本。它们不适用于 1.8.x 版本。

【讨论】:

感谢您的回复,好点子,但是当我对两者都使用绝对地址时,使用相同的用户凭据(我通过 netbeans 数据库连接创建数据库文件,然后尝试从程序中使用它,我得到了这个: java.sql.SQLException: Database lock acquisition failure: lockFile: org.hsqldb.persist.LockFile@340e5f64[file =/home/myhome/tmp/mydb1/mydb1.lck 知道吗?以某种方式在 mydb1.script 中设置许可? 您可以一次使用一个进程访问数据库。该错误表明数据库仍由其他 Java 进程保持打开状态。如果您想同时访问,请运行 HSQLDB 服务器。

以上是关于运行程序后文件数据库中没有模式通过休眠持久化到 hsqldb:file的主要内容,如果未能解决你的问题,请参考以下文章

持久化配置问题

休眠和弹簧持久性问题。可能的身份值没有增加?

休眠后,Android应用程序在kindle fire上关闭

传递给持久化的休眠分离实体

如何关闭休眠模式

Redis