【发布时间】:2015-03-16 09:59:51
【问题描述】:
在 JPA 中,如果我尝试使用 setter 和 getter 方法更新托管对象而不使用事务开始和提交,考虑到 FlushType 位于 AUTO 中,JPA 是否会自动更新数据库(不是立即更新,而是稍后更新)。
【问题讨论】:
标签: java hibernate jpa orm transactions
在 JPA 中,如果我尝试使用 setter 和 getter 方法更新托管对象而不使用事务开始和提交,考虑到 FlushType 位于 AUTO 中,JPA 是否会自动更新数据库(不是立即更新,而是稍后更新)。
【问题讨论】:
标签: java hibernate jpa orm transactions
在 JPA 中,实体状态转换不会自动与数据库同步。如果实体附加到持久性上下文,则在flush-time,automatic dirty checking mechanism 将对象状态更改转换为 DML 语句。
但这需要实体由持久化上下文管理,否则脏检查机制不会触发。
虽然 JPA 规范只要求将 entity state transitions 包装在逻辑事务中:
You should ALWAYS use transaction,即使只读取数据。
如果您在读取数据时没有显式使用事务,那么您会退回到自动提交模式,给连接池机制带来额外压力,并最终导致每个查询一个数据库事务。
【讨论】:
我使用的实现(DataNucleus JPA)确实允许这样做(如自动提交模式)。如果未启用该模式,则它会退回到标准 JPA 所做的事情,即在下一个事务之前保留这些更改。
【讨论】: