使用Hibernate在惰性初始化集合中添加和删除元素

时间:2013-10-01 09:58:33

标签: java performance hibernate caching jpa

两个实体 - 父母与子女,处于一对多的关系中。重要部分:

@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实体时会出现问题:

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

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

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

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


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

0 个答案:

没有答案