我正在使用Hibernate 5.2.1和Spring 4.3.0
我目前的理解是:
import os
def get_next_run(path):
id = 1
while(os.path.exists(path + "/run" + id)):
id += 1
return path + "/run" + id
,.flush()
,.clear()
/ .openSession()
的来电
.getCurrentSession()
ed对象.persist()
ed对象我已经花了太多时间在不那么快乐的bug搜索中,最终在我身上发现我错过了.persist()
注释,错过了配置合理的事务模式或者无法在Spring中配置事务管理器。 / p>
我
我做希望我的软件足够强大,可以告诉我什么时候我做了一些愚蠢的事情或忘记了某些事情,而不是只是默默地失败并陷入未定义的行为模式。
在错过交易时,是否有可能让hibernate大声抱怨?
我接近这个错误的方式吗?我误解了什么吗?
仅供参考:
答案 0 :(得分:1)
Hibernate社区表示,在事务之外工作可能会导致不可预测的行为。这是因为Hibernate将打开事务,但它不会自己关闭它,因此连接将返回到连接池,而事务未被提交。那么会发生什么? JDBC保持沉默,因此这是特定于实现的(MySQL回滚事务,Oracle afair提交它)。这也可以在连接池级别配置(例如,C3P0为您提供了这样的选项,默认情况下为回滚)。
当它缺少一个时,是否有可能让hibernate大声抱怨 交易?
您需要为以下类设置日志记录阈值为DEBUG:
对于JDBC事务(例如RESOURCE_LOCAL)
对于SLF4J日志记录:
<logger name="org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction" level="debug"/>
对于Log4j:
<logger name="org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction">
<level value="DEBUG"/>
</logger>
对于JTA交易
对于SLF4J日志记录:
<logger name="org.hibernate.engine.transaction.internal.jta.JtaTransaction" level="debug"/>
对于Log4j:
<logger name="org.hibernate.engine.transaction.internal.jta.JtaTransaction">
<level value="DEBUG"/>
</logger>
在日志中,您将看到以下条目:
:
DEBUG [Alice]: o.h.e.t.i.j.JdbcTransaction - initial autocommit status: true
DEBUG [Alice]: o.h.e.t.i.j.JdbcTransaction - disabling autocommit
:
DEBUG [Alice]: o.h.e.t.i.j.JdbcTransaction - committed JDBC Connection
DEBUG [Alice]: o.h.e.t.i.j.JdbcTransaction - re-enabling autocommit
最好尽可能少地激活DEBUG级别,否则你的日志大小会急剧增加。
我接近这个错误的方式吗?我误解了什么吗?
如果您可能在某处遗忘@Transactional
,请尝试使用autocommit=true
进行休眠,这对于愚蠢的代码几乎没有失败并记住您。
或者您可以使用aspectj
使所有DAO方法成为事务性的。