3

我手动创建了我的数据库,然后使用 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() 后直接停止程序,数据库将不会更新。事实上,无论我执行多少操作,在线程完成之前似乎都不会在数据库中更新。我认为flush()将休眠缓存中的所有更新推送到数据库中?我错过了什么?我认为这是同一个问题,因为Hibernate 刷新不会更新数据库,但我没有任何 for 循环正在进行。

4

2 回答 2

8

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

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

提交隐式调用了flush(),但flush 不调用commit()。

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

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

于 2012-10-02T11:44:48.373 回答
2

如果您明确提交事务怎么办:

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)

这里检查

于 2012-10-02T11:01:32.443 回答