如何恢复对Hibernate中实体拥有的集合的更改?

如何恢复对Hibernate中实体拥有的集合的更改?,hibernate,entity,second-level-cache,revert,Hibernate,Entity,Second Level Cache,Revert,这应该是一个简单的任务,但我不能让它工作 我希望能够将更改恢复到一个延迟加载的集合(让我们称之为kittens),该集合挂在一个Hibernate会话中维护的主实体(让我们称之为Cat)上 该系列的定义如下(用猫和小猫取代我的单调实体): 它不会从数据库中重新检索小猫(如日志所示)。我做错了什么?从二级缓存中驱逐小猫没有任何效果,只要它们仍然在一级缓存中。这是从中加载对象的位置。在第一级缓存中,只有引用,即。E修改实例并从一级缓存重新加载实体时,将再次获得修改后的实例 第一级缓存位于会话对象内部

这应该是一个简单的任务,但我不能让它工作

我希望能够将更改恢复到一个延迟加载的集合(让我们称之为kittens),该集合挂在一个Hibernate会话中维护的主实体(让我们称之为Cat)上

该系列的定义如下(用猫和小猫取代我的单调实体):


它不会从数据库中重新检索小猫(如日志所示)。我做错了什么?

从二级缓存中驱逐小猫没有任何效果,只要它们仍然在一级缓存中。这是从中加载对象的位置。在第一级缓存中,只有引用,即。E修改实例并从一级缓存重新加载实体时,将再次获得修改后的实例

第一级缓存位于会话对象内部。您必须使用
session.execute()
将小猫从会话中逐出。(
Session.clear()
或创建新会话具有相同的效果,但会强制重新加载存储在会话一级缓存中的所有对象。这取决于您的应用程序是否是更好的解决方案。)

我认为,经过此修改后,您不需要随时调用
SessionFactory.executeCollection()
。顺便说一下,
SessionFactory.executioncollection()
被标记为已弃用

@Entity
@Table(name="CAT")
public class Cat {

    private Map<Long, Kitten> kittens;

    @OneToMany(fetch=FetchType.LAZY, mappedBy="mother", cascade={CascadeType.ALL})
    @MapKey(name="id")
    public Map<Long, Kitten> getKittens() {
        return kittens;
    }

    ...
}

@Entity
@Table(name="KITTEN")
public class Kitten {

   private Cat mother;

    @ManyToOne(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CadcadeType.MERGE)
    @JoinColumn(name="MOTHER_CAT_ID", nullable=false)
    public Cat getMother {
        return mother;
    }

    ...
}
public class CatDao {

    public Cat reset(Cat cat) {

        SessionFactory sessionFactory = Util.getSessionFactory();
        sessionFactory.evictCollection(Cat.class.getName() + ".kittens", cat.getId());

        Cat original = (Cat)this.session.get(Cat.class, cat.getId());
        Hibernate.initialize(original.getKittens());

        return original;
    }

    ...
}