在编写“非规范化”集合时,我遇到了 NONSTRICT_READ_WRITE 和 READ_WRITE CacheConcurrencyStrategy 之间的差异......我的想法是我有一个连接表建模为实体,但它还包含指向它连接的表的只读链接。
我的实体,大致:
@Entity
@org.hibernate.annotations.Entity(dynamicUpdate = true)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Actor {
@Id
Integer id;
@Column
String name;
}
@Entity
@org.hibernate.annotations.Entity(dynamicUpdate = true)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Movie {
@Id
Integer id;
@Column
String title;
}
@Entity
@org.hibernate.annotations.Entity(dynamicUpdate = true)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Credit {
@Column
String roleName;
@ManyToOne(targetEntity = Movie.class, optional = true)
@JoinColumn(name = "movie_id", insertable = false, updatable = false)
@NotFound(action = NotFoundAction.IGNORE)
Movie movie;
@Column(name = "movie_id")
Long movieId;
@ManyToOne(targetEntity = Actor.class, optional = true)
@JoinColumn(name = "actor_id", insertable = false, updatable = false)
@NotFound(action = NotFoundAction.IGNORE)
Actor actor;
@Column(name = "actor_id")
Long actorId;
}
启用二级对象缓存(使用 ehcache)。
我的应用程序编写 Movies 和 Actors... 一段时间后,它通过编写 Credit 将它们链接在一起。在写 Credit 的时候,我只填写了 roleName、movieId 和 actorId 字段,我没有提供 Movie 和 Actor 对象。
使用 NONSTRICT_READ_WRITE 缓存,我可以读回 Credit 对象,它将包含引用的 Movie 和 Actor 对象。
使用 READ_WRITE 缓存,读回 Credit 将返回一个具有空 Movie 和 Actor 字段的 Credit。如果我清除休眠缓存,则读取该 Credit 然后按预期包含 Movie 和 Actor 对象。这也是 TRANSACTIONAL 缓存的行为(但当然不是 NONE 缓存)。
因此,当使用 READ_WRITE 缓存时,似乎休眠将 Credit 插入到具有空 Actor 和 Movie 字段的 2 级缓存中。有没有办法防止这种情况发生并始终从数据库中读取以取回这些连接字段?我尝试使用 CacheConcurrencyStrategy.NONE 仅注释字段,但这不起作用。