编程语言
首页 > 编程语言> > java-Spring @Transactional是否使用任何Hibernate缓存?

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

作者:互联网

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

    //or select and update as well
}

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

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

解决方法:

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

连续的服务方法调用(例如getEntity)总是以新的Hibernate会话结束,因此将从数据库中加载新的实体.

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

为防止数据完整性异常,无论如何请考虑使用optimistic locking.

标签:spring-transactions,hibernate,transactions,spring,java
来源: https://codeday.me/bug/20191120/2047218.html