JPA和Hibernate是否在没有事务开始和提交的情况下自动更新数据库

Does JPA and Hibernate automatically update database without transaction begin and commit

在 JPA 中,如果我尝试使用 setter 和 getter 方法更新托管对象而不使用事务开始和提交,考虑到 FlushTypeAUTO.

我使用的实现 (DataNucleus JPA) 确实允许这样做(比如自动提交模式)。如果未启用该模式,那么它将回退到标准 JPA 所做的,即保留这些更改直到下一个事务。

在 JPA 中,实体状态转换不会自动与数据库同步。如果实体附加到持久性上下文,则在 flush-time, the automatic dirty checking mechanism 将对象状态更改转换为 DML 语句。

但这需要实体由持久化上下文管理,否则不会触发脏检查机制。

尽管 JPA 规范只要求 entity state transitions 包装在逻辑事务中:

You should ALWAYS use transaction,即使只读取数据。

如果您在读取数据时没有明确使用事务,那么您将退回到自动提交模式,给连接池机制带来额外压力,并最终导致每次查询一个数据库事务。