两个实体 - 父母与子女,处于一对多的关系中。重要部分:
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Parent {
private Collection<Child> children;
@OneToMany(mappedBy = "parent")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public Collection<Child> getChildren() {
return children;
}
}
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Child {
private Parent parent;
@ManyToOne
public Parent getParent() {
return parent;
}
}
在添加或删除子项的情况下,我遇到两个问题。正在处理(通过Session或EntityManager保存或删除)子实体,但在尝试更新其子项被添加/删除的Parent实体时会出现问题:
如果未初始化children
集合,则在将一个子项添加到集合中(如果它是代码中的Set而不是此处的集合),或者删除(任何类型的集合) - 集合将被初始化,如果集合未被缓存,将导致数据库查询。
为了防止这种情况,我认为首先要检查条件:如果集合已初始化(JPA和Hibernate都提供了检查此方法)或者集合是否在缓存中(需要使用角色来检查这可能必须硬编码 - 然后进行添加/删除。如果不满足这些条件,则无需更新集合,因为它将在第一次从数据库中获取时是最新的。
有没有更好的方法来执行此操作,因为“解决方案”需要检查缓存,并且还要通过使用角色字符串来执行此操作(如果使用完全限定的域名作为角色,则可以构造字符串通过反射,但看起来很脏,如果明天将角色作为特定字符串给出,可能会导致问题?)
如果children
集合被缓存,添加/删除它将导致集合在缓存中失效,因此下次请求它时,将从数据库中读取它。我知道集合永远不会在缓存中更新,但是在缓存中立即刷新数据的最佳方法是什么(在添加/删除时我们拥有所有信息),而不必等待稍后的数据库查询何时请求收集?
因此,这些问题的目标是确定正确的方式,以便在所描述的场景中使用(延迟初始化的)集合。