JPA постоянные объекты без вызова persist - PullRequest
0 голосов
/ 17 ноября 2010

У меня есть класс сущности 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.

Этот список связан с таблицей данных, откуда я могу выполнять некоторые операции обновления, такие как:

<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 объекта документа обновление также выполняется в БД без фактического выполнения PERSIST ....

Вы знаете, ПОЧЕМУ?

Ответы [ 2 ]

3 голосов
/ 17 ноября 2010

Когда вы загружаете объект через сеанс гибернации, он управляется этим сеансом. Когда вы вносите изменения, во время сброса изменения в объекте синхронизируются с базой данных.

Таким образом, вызов persist() не требуется для сохранения изменений данных. (Похожие: http://techblog.bozho.net/?p=227)

0 голосов
/ 17 ноября 2010

Один из способов обойти это и внести изменения в сущность, не сохраняя в базе данных, это удалить из сеанса:

org.hibernate.Session session = (Session) em.getDelegate();
session.evict(yrEnity);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...