JPA持久化对象而不调用persist

时间:2010-11-17 09:21:05

标签: java hibernate orm jpa

我有一个实体类Document,另一个叫做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中完成的,而实际上没有PERSIST ....

你知道为什么?

2 个答案:

答案 0 :(得分:3)

通过hibernate会话加载对象时,它由该会话管理。进行更改时,在刷新时,对象中的更改将与数据库同步。

因此不需要调用persist()来保持数据修改。 (相关:http://techblog.bozho.net/?p=227

答案 1 :(得分:0)

您可以通过从会话中删除来解决此问题并在不持久保存到数据库的情况下对实体进行更改的一种方法:

org.hibernate.Session session = (Session) em.getDelegate();
session.evict(yrEnity);