JPA Entity обновляет базу данных без сохранения / слияния

1

В нашем приложении Java используется Toplink JPA для подключения уровня доступа к данным в нашу базу данных SQL Server 2008.

Мы можем запросить базу данных и получить наши результаты без каких-либо проблем. Проблема в том, что если мы попытаемся изменить возвращаемый объект, он будет сохраняться в базе данных сразу после вызова сеттера.

Query rQuery = em.createNamedQuery("Region.findAll");
Region r= rQuery.getResultList();
r.setActive(active);

Из того, что мы читали в JPA, похоже, что он не должен отправлять изменения в базу данных до тех пор, пока не будет вызываться persist/merge/flush. Это поведение, которое мы хотим иметь. Мы хотим иметь возможность сделать все наши изменения, а затем отправить их сразу. Если мы отправим их по одному, и мы получим сообщение об ошибке, мы получим частично обновленные записи.

Я попытался настроить режим флеш-менеджера сущностей для фиксации, чтобы заставить его ждать вызова фиксации до его сохранения, и это не имело никакого значения.

em.setFlushMode(FlushModeType.COMMIT);

Я также попытался отсоединить возвращаемый объект до вызова сеттеров, но он выдает исключение.

java.lang.AbstractMethodError: oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl.detach(Ljava/lang/Object;)

Это первый раз, когда мы используем Toplink JPA, и мы не знаем, что еще попробовать. Если у кого-то есть другие предложения по устранению этой проблемы, я бы очень признателен.

Теги:
hibernate
entity-framework
jpa
toplink

1 ответ

1
Лучший ответ

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

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

Решение состоит в том, чтобы сделать запрос данных в другом методе с атрибутом транзакции "Require_new" и передать результирующий набор методу, который выполняет обновление с атрибутом транзакции "требуется" или "обязательно".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню