2010-11-17 69 views
0

我有一个实体类Document和另一个名为空间。关系:JPA坚持对象没有调用persist

@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。

<a:commandLink value="move" action="#{moveDocsOperation.moveDocumentToNewSpace(entity)}" reRender="confim,origTable,newTable"/> 

和方法:

这个列表是从那里我可以做这样一些更新操作绑定到一个DataTable

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 ....

你知道吗为什么?

回答

3

当您通过休眠会话加载对象时,它由该会话管理。当您进行更改时,在刷新时间内,对象中的更改将与数据库同步。因此调用persist()不需要持久化数据修改。 (相关阅读:http://techblog.bozho.net/?p=227),你可以避开这个问题,并进行更改实体没有坚持到数据库

+0

非常感谢。所以这意味着隐式FlushMode是AUTO? – 2010-11-17 10:04:17

+0

是的,它是AUTO .. – Bozho 2010-11-17 10:12:24

0

一种方法是从会话中删除:

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