【问题标题】:Data is not being inserted into HSQLDB database using Hibernate未使用 Hibernate 将数据插入 HSQLDB 数据库
【发布时间】:2012-07-22 04:39:06
【问题描述】:

我负责提交事务,但保存对象后数据库仍然为空。没有错误,休眠甚至显示插入的SQL命令。当我将 <property name="hibernate.connection.autocommit">true</property> 行添加到我的休眠配置 xml 时,一切正常,但我听说这不是一个好习惯。我正在使用 HSQLDB 数据库。

这是我插入数据的一段代码。

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    Client c = new Client();
    c.setImie("John");
    c.setNazwisko("Kennedy"); 
    session.save(c);
    session.getTransaction().commit();
    session.close();

【问题讨论】:

    标签: java database hibernate hsqldb


    【解决方案1】:

    在通过代码进行更改时,有时将;shutdown=true 添加到您的连接字符串并没有帮助。

    因此,每次您通过 HSQLDB 中的代码进行更改(插入、删除、更新等)时,只需从您的代码中手动运行查询“SHUTDOWN SCRIPT”。这将正确关闭 HSQLDB 并立即保存 .properties.script 文件中的更改。

    您的查询应如下所示:

    SQLQuery query = session.createSQLQuery("SHUTDOWN SCRIPT");
    

    【讨论】:

      【解决方案2】:

      我的问题的解决方案在该线程link的第一条评论中描述

      【讨论】:

      • 但这正是我提到的,或者不是?只是属性名称错误:hibernate.connection.url。来吧。
      • 不是真的,我只需要添加 Thread.sleep(1000) 因为 JVM 关闭得太快了。
      • 糟糕,抱歉。我以为你说答案在“第一个答案”中,但它是“在第一个评论中”。
      【解决方案3】:

      在提交到数据库之前,您可能忘记使用 session.flush() 将对象保存到数据库 (session.getTransaction().commit())。 正如 Hibernate 引用本身所说:

      强制此会话刷新。必须在一个单元的末尾调用 工作,在提交事务和关闭会话之前 (取决于刷新模式,Transaction.commit() 调用此方法)。

      还有:

      "刷新是同步底层持久化的过程 存储在内存中的可持久状态。”

      编辑:

      在阅读了一些关于 HSQLDB 的内容后,我看到了一些可能发生在你身上的事情:

      1 - 因为 HSQLDB 默认不是Durable('ACID' 中的 D),它不会立即将数据持久化到磁盘。我知道。没那么可爱。所以你必须在最后一个连接完成时“强制”写入你的更改,设置属性shutdown=true; 来自用户指南:

      您可以使用 shutdown=true 连接属性来确保 数据库在连接关闭后完全持久化。

      2 - 要将您的更改立即写入磁盘,请使用属性hsqldb.write_delay=false

      所以,你最终会在你的连接字符串中得到这样的东西:

      ;shutdown=true;hsqldb.write_delay=false;
      

      希望对你有帮助!

      【讨论】:

      • 我按照您的建议更改了代码,但没有帮助。不知道发生了什么。
      • 好的。你能更详细地编辑你的帖子吗?也许发布你的 xml 配置也会很好。
      • 抱歉这么晚才回复,但我最近有一点时间,我发现问题比我描述的要复杂一些。而且,我不明白你所说的“连接字符串”是什么意思,我尝试了很多与<property name="connection.url">jdbc:hsqldb:file:/db/;shutdown=true;hsqldb.write_delay=false </property> 或类似的组合,但没有任何效果。
      【解决方案4】:

      其中一些可能在某些情况下自动发生,但除非您配置为自动执行,否则您需要按以下顺序执行所有三个操作:

      1. Session.save() 从 JVM 内部更新 Hibernate 的对象视图。
      2. Session.flush() 通过发出 SQL 语句更新数据库的对象视图。
      3. Session.getTransaction().commit() 在数据库中提交事务。

      http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/Session.html#flush()

      【讨论】:

      • 我按照您的建议在 commit() 之前添加了 session.flush(),但没有任何改变 - 数据库仍然是空的
      猜你喜欢
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 2021-08-14
      相关资源
      最近更新 更多