Как определить, произошло ли нарушение отложенного ограничения Oracle в JPA? - PullRequest
3 голосов
/ 21 декабря 2011

Oracle 11g автоматически откатывает транзакцию при фиксации, если транзакция имеет нарушение отложенного ограничения.Один из способов получить ошибку - установить ограничение немедленный перед вызовом commit.Это прекрасно работает с использованием Oracle SQL Developer, но выполнение этого в собственном запросе JPA (EclipseLink) приводит к блокировке приложения.Есть ли какой-нибудь альтернативный способ уведомления о нарушении отложенного ограничения?Или, возможно, я не правильно использую JPA?

Определение таблицы:

create table foo
(
foo_id integer not null,
order_id integer not null,
constraint foo_pk primary key (foo_id),
constraint foo_ak unique (order_id) deferrable
);

SQL для генерации нарушения и просмотра ошибки, отображаемой на консоли:

set constraint foo_ak deferred;
insert into foo values (1, 1);
insert into foo values (2, 1);
set constraint foo_ak immediate; -- Will rollback and display error

JPA пытаетсяпереупорядочить коллекцию объектов foo в компоненте сеанса без состояния:

public void edit(List<Foo> foos) {
    Query deferred = em.createNativeQuery("set constraint foo_ak deferred");
    Query immediate = em.createNativeQuery("set constraint foo_ak immediate");

    deferred.executeUpdate(); // This works

    for(Foo f: foos) {
        em.merge(f); // This works too
    }

    immediate.executeUpdate(); // Hang with no output!
    // Note: if I comment out above line the transaction may 
    // be silently rolled back on deferred constraint violation
}

1 Ответ

1 голос
/ 28 декабря 2011

Проблема может заключаться в кэшировании операторов и в стратегии транзакций сервера приложений.

Попробуйте:

  • принудить менеджер сущностей отправлять данные в базу данных, вызвав em.flush () after для выполнения {}

и / или

  • Измените атрибут @TransactionManagement на управляемый компонентом и управляйте транзакцией в вашем методе
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...