2010-11-17 6 views
0

J'ai une classe d'entité Document et une autre appelée Espace. La relation:Objets persistants JPA sans appel persistant

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

Eh bien, j'interroge la base de données et prend quelques docs dans une LinkedList.

Cette liste est binded à un dataTable où je peux faire des opérations de mise à jour comme:

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

et la méthode:

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); 
} 

Je ne comprends pas pourquoi, lors du réglage du VersEspace de l'entité de document, la mise à jour est également faite dans DB sans réellement faire PERSIST ....

savez-vous POURQUOI?

Répondre

3

Lorsque vous chargez un objet via la session de mise en veille prolongée, il est géré par cette session. Lorsque vous apportez des modifications, au moment du vidage, les modifications de l'objet sont synchronisées avec la base de données.

Il n'est donc pas nécessaire d'appeler persist() pour conserver les modifications de données. (Rapporté: http://techblog.bozho.net/?p=227)

+0

Merci beaucoup. Cela signifie donc implicitement que FlushMode est AUTO? –

+0

oui, c'est AUTO .. – Bozho

0

Une façon de contourner cela et apporter des modifications à l'entité sans persister à la base de données en supprimant de la session:

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