Spring @Transactional 是否使用任何 Hibernate 缓存?

mem*_*und 6 java spring hibernate transactions spring-transactions

@Transactional
public MyEntity getEntity(long id) {
    return dao.findOne(id);

    //or select and update as well
}
Run Code Online (Sandbox Code Playgroud)

每次调用事务方法时:我会从休眠中获取任何缓存的实体吗(第一次除外)?或者我总是会从数据库中获取新的实体?

这很重要,因为我将有两个独立的应用程序共享同一个数据库,并且我想确保 hibernate 不会返回任何缓存的实体,而另一个应用程序可能已经在后台更新了数据库中的同一个实体。

Vla*_*cea 6

如果这是您的服务层的事务边界,那么 Hibernate 将创建一个新的 Session,这意味着第一级缓存中没有任何内容。如果您尝试findOne在同一个服务方法中两次调用该方法,则第二次调用将从缓存中获取实体。

连续的服务方法调用(例如 getEntity)总是以一个新的 Hibernate Session 结束,因此从数据库加载一个新的实体。

如果您使用二级缓存并为此实体激活它,那么 Hibernate 将始终首先命中缓存,并在缓存未命中时回退到数据库加载。

为了防止数据完整性异常,无论如何都要考虑使用乐观锁