这应该是一项非常简单的任务,但我无法让它发挥作用。
我希望能够将更改还原到一个延迟加载的集合(我们称之为小猫),它挂在一个单一的 Hibernate 会话中维护的主要实体(我们称之为猫)上。
集合是这样定义的(用猫和小猫代替我的呆板实体):
@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;
}
...
}
用户可以在 kittens 集合中添加和删除他们心中的内容,而无需持久保存,直到他们明确保存并执行会话刷新。
但是如果用户选择恢复原始的小猫列表,则应该再次从数据库中检索。
我试图通过从二级缓存中逐出小猫集合然后使用以下模式从数据库中重新获取 Cat 实体来实现集合的完全还原:
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;
}
...
}
它不会从数据库中重新检索小猫(如日志所示)。我究竟做错了什么?