我正在将我的Dao层从KodoJDO移植到Hibernate。 我将菜单保存在数据库中并根据用户的权利我修剪本地副本以仅显示允许用户执行的操作。
当我在KodoJDO中做到这一点时,我不得不做出令人瞩目的事情,因为我不想将更改写回db。
我在Hibernate中没有看到任何等效函数。有吗?如何防止这些更改被写回数据库。
这是修剪功能。
public void prune(Collection<Entitlement> ents)
{
Session session=PersistenceManager.getManager();
// Rewrite----------------------------------
//session.makeTransient(this);
for (Iterator<Leaf> iter = leafs.iterator(); iter.hasNext();)
{
Leaf l = (Leaf) iter.next();
if(!l.isAllowed(ents))
{
iter.remove();
}
}
for (Iterator<Branch> iter = branches.iterator(); iter.hasNext();)
{
Branch b = (Branch) iter.next();
if(b!= this)
{
b.prune(ents);
}
if (b.hasNoChildren())
{
iter.remove();
}
}
}
评论答案。我接受了最完整的那个,但是skaffman和Affe的答案也很有价值。
答案 0 :(得分:2)
evict(Object object)
是您正在寻找的Session
界面上的方法。
另请注意,hibernate中的词汇表有点不同。根据Session javadoc:
transient: never persistent, not associated with any Session
persistent: associated with a unique Session
detached: previously persistent, not associated with any Session
如此短暂并不意味着完全相同的事情。 “分离”是他们用于你所谈论的词语。
答案 1 :(得分:1)
在JPA 2.0中它是entityManager.detach(..)
。我明确地给出了JPA版本,因为建议通过JPA使用hibernate。
如果我们看一下hibernate的detach(..)
中如何实现EntityManagerImpl
方法,它会在基础会话中使用getSession().evict(entity)
但请注意,您应该很少需要这样做。我不知道这是否是JDO中的常见做法,但在JPA / Hibernate中,如果你正确使用它们则不需要它。
根据您的评论 - 如果您想将hibernate实体用作其值已更改但不会持久化的对象。我没有像那样使用它们,因为我的视图中通常没有开放的会话/实体管理器。或者我使用值对象。如果您在视图中都有一个打开的会话,并且您没有值对象 - 是的,这是一个有效的用法。
答案 2 :(得分:0)
Session.evict(entity)
可能has the semantics您正在寻找:
从会话缓存中删除此实例。对实例的更改将不会与数据库同步。