在flush()之后Hibernate没有更新数据库

时间:2012-10-02 10:42:26

标签: hibernate

我手动创建了我的数据库,然后使用Hibernate工具生成我的Pojo,DAO。 当我创建一个对象并将其持久保存到数据库时,它似乎工作正常

        DefinitionT def = new DefinitionT();
        def.setSelected(false);
        def.setValue(sqlEncode(definition));
        def.setWordId(wordT.getId());
        definitionTDao.persist(def);

这是我的persist()方法

public void persist(Object o)
{
    try
    {
        hSession.persist(o);
        hSession.flush();
    }
    catch (Exception e)
    {
        hTransaction.rollback();
        log.error(e.getMessage());
    }
}

当我的线程完成时,数据库将使用新对象进行更新。但是,我注意到如果在调用persist()之后直接停止程序,则数据库将不会更新。事实上,无论我执行了多少操作,似乎没有任何东西似乎在DB中更新,直到线程完成。我以为flush()将hibernate缓存中的所有更新推送到数据库中? 我错过了什么?我认为这与Hibernate flush doesn't update database的问题相同,但我没有任何for循环。

2 个答案:

答案 0 :(得分:7)

Flush意味着Hibernate会话最终会对SQL语句进行排序,然后将它们发送到数据库。然后,数据库执行它们(在回滚段中)但不会使修改持久化,也不会使其他用户可用。

提交最终让数据库持久存储修改。 (例外情况是数据库处于自动提交模式 - 我不建议这样做,因为无法保证事务的正确性,并且自动提交不适用于所有数据库,或者如果刷新模式设置为提交 - 也不是必要的;这会失去灵活性。)

提交隐含地调用flush(),但flush不调用commit()。

适用于您的解决方案:在程序结束时进行额外提交。

(顺便说一下,通常在每次事务之后都会进行刷新,但是为了更好的性能,在许多事务之后进行提交。)

答案 1 :(得分:1)

如果明确提交交易怎么办:

Transaction hTransaction = null;
try {
hTransaction = hSession.beginTransaction();

hSession.persist(o);


hTransaction.commit();
hSession.flush();

}
catch (Exception e)
{
    hTransaction.rollback();
    log.error(e.getMessage());
}

实际上正如我所知,当您刷新会话时,应该提交使用此会话打开的任何事务,但请检查此信息,确保使用正在刷新的会话创建事务。

刚刚提交时检查是否自动刷新,模式应为:

hSession.setFlushMode(FlushMode.COMMIT)

here

查看