我手动创建了我的数据库,然后使用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循环。
答案 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
查看