1

两个实体——父母和孩子,一对多的关系。重要部分:

@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 保存或删除),但在尝试更新添加/删除子实体的父实体时会出现问题:

  1. 如果children集合未初始化,则在向集合添加子项时(如果它是 Set 而不是代码中的集合),或在删除时(任何类型的集合) - 集合将被初始化,如果集合未缓存,将导致数据库查询。

    为了防止这种情况,我认为一些想法是首先检查条件:如果集合已初始化(JPA 和 Hibernate 都提供了检查这个的方法)或者集合是否在缓存中(需要使用角色来检查这个,哪个可能必须进行硬编码) - 然后进行添加/删除。如果不满足这些条件,则无需更新集合,因为它将在第一次从数据库中获取时是最新的。

    有没有更好的方法来做到这一点,因为“解决方案”需要检查缓存,并且还可以通过使用角色字符串来做到这一点(如果使用完全限定的域名作为角色,则可以通过反射构造字符串,但这看起来很脏,如果明天将角色作为特定字符串给出,可能会导致问题)?

  2. 如果children集合被缓存,添加/删除它会导致集合在缓存中失效,所以下次请求时,将从db中读取。我知道集合永远不会在缓存中更新,但是什么是立即刷新缓存中数据的最佳方法(因为在添加/删除时我们拥有所有信息),而不必等待数据库查询稍后何时要求收集?


因此,这些问题的目标是确定在所描述的场景中使用(延迟初始化)集合的正确方法。

4

0 回答 0