@Transactional
public MyEntity getEntity(long id) {
return dao.findOne(id);
//or select and update as well
}
每次调用事务方法时:我是否会从hibernate获取任何缓存实体(第一次除外)?或者我是否总是从DB获取新的实体?
这很重要,因为我将有两个独立的应用程序将共享相同的数据库,我想确保hibernate不返回任何缓存的实体,而另一个应用程序可能已经在后台更新了DB中的相同实体。 / p>
答案 0 :(得分:2)
如果这是服务层的事务边界,那么Hibernate将创建一个新的Session,这意味着first level cache中没有任何内容。如果您尝试在同一服务方法中调用findOne
方法两次,则第二次调用将从缓存中获取实体。
连续的服务方法调用(例如getEntity)总是以新的Hibernate会话结束,因此从数据库中加载了一个新的实体。
如果您使用二级缓存并为此实体激活它,那么Hibernate将始终首先点击缓存并在缓存未命中时回退到数据库加载。
为防止数据完整性异常,请考虑使用optimistic locking。
答案 1 :(得分:1)
简短的回答是肯定的
答案很简单:@Transactional所做的就是为你提供一个休眠会话,并开始/提交一个事务,如果配置的话。
它不关心会话是否启用了缓存。缓存由会话在内部完成。
所以你只需要了解hibernate缓存:
默认情况下启用一级缓存(每个会话),你不能禁用它,
默认情况下,二级缓存(每个SessionFactory)处于禁用状态,请参阅here如何启用Ehcache(只有@Cache带注释的实体最终在二级缓存中)。
@Transactional是打开新会话还是重用现有会话是可配置的,它取决于CurrentSessionContext实现。您可以插入自己的实现。