我有一个实体类文档和另一个叫做Space的文档。关系:
@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST,
CascadeType.MERGE, CascadeType.REFRESH}, optional = true)
@ForeignKey(name = "FK_TO_SPACE__DOCUMENT")
@IndexedEmbedded(prefix = DocumentDefaultFields.SPACE_TO_PREFIX)
private Space toSpace;好吧,我会查询数据库并将一些文档放入LinkedList中。
这个列表被绑定到一个dataTable,在那里我可以执行一些更新操作,比如:
<a:commandLink value="move" action="#{moveDocsOperation.moveDocumentToNewSpace(entity)}" reRender="confim,origTable,newTable"/>其方法是:
public void moveDocumentToNewSpace(final Document document) {
log.info("~~move document #0 from space #1 to space #2", document.getDocumentId(), origSpace.getPath(), newSpace.getPath());
document.setToSpace(newSpace);
origSpaceDocuments.remove(document);
newSpaceDocuments.add(document);
entityAuditer.auditBean(document, Crud.UPDATE);
}我不明白为什么在设置文档实体的toSpace时,更新也是在DB中完成的,而没有实际执行持久化.
你知道为什么吗?
发布于 2010-11-17 09:43:44
当您通过hibernate会话加载一个对象时,它由该会话管理。当您进行更改时,在刷新时对象中的更改将与数据库同步。
因此,不需要调用persist()来持久化数据修改。(相关:http://techblog.bozho.net/?p=227)
发布于 2010-11-17 11:01:12
一种可以绕过这个问题并在不持久化数据库的情况下对实体进行更改的方法是从会话中移除:
org.hibernate.Session session = (Session) em.getDelegate();
session.evict(yrEnity);https://stackoverflow.com/questions/4202993
复制相似问题