Обход проверки бина во время выбора, но не во вставке / обновлении - PullRequest
3 голосов
/ 20 декабря 2011

Я использую Glassfish 3.1.1 (JSF 2, JPA 2, EclipseLink, Bean Validation).

Я пытаюсь реализовать проверку с помощью API Bean Validation с этими аннотациями: @Past,@Future и @NotNull.

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

[#|2011-12-20T10:18:30.286+0100|WARNING|glassfish3.1.1|javax.enterprise.resource.jta.com.sun.enterprise.transaction|_ThreadID=36;_ThreadName=Thread-2;|DTX5014: Caught exception in beforeCompletion() callback:
javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'preUpdate'. Please refer to embedded ConstraintViolations for details.
    at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.validateOnCallbackEvent(BeanValidationListener.java:90)
    at org.eclipse.persistence.internal.jpa.metadata.listeners.BeanValidationListener.preUpdate(BeanValidationListener.java:72)

Я видел в спецификации, что я могу отключить проверку JPA с этим свойством javax.persistence.ValidationMode, но как отключить проверку во время выбора, но НЕ во время вставки или обновления ?

Заранее спасибо за помощь.

Ответы [ 3 ]

3 голосов
/ 21 декабря 2011

Проблема заключается в том, что все в контексте постоянства будет проверено.

Вы можете избежать добавления объектов в контекст постоянства, читая их в другом EntityManager вне транзакции, или используя «eclipselink».Подсказка .read-only "при их чтении.

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

2 голосов
/ 21 декабря 2011

Несколько комментариев. Во-первых, режим проверки ( javax.persistence.validation.mode ) определяет только режим проверки: авто, обратный вызов или нет.

Что вам нужно, так это свойства:

  • javax.persistence.validation.group.pre-упорствовать
  • javax.persistence.validation.group.pre-обновление
  • javax.persistence.validation.group.pre-удалить

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

Хотя, глядя на вашу ошибку, preUpdate , похоже, не работает. Что и как именно вы получаете эту ошибку?

1 голос
/ 17 мая 2016

ОК У меня похожая проблема с Даты в моем приложении.У меня есть Транзакция сущность и термин Термин, связанные вместе, и если Транзакция устареет, я перемещаю ее в Историческая транзакция .Поэтому я хочу, чтобы старые термины (периоды) оставались в базе данных, но также предотвращали создание новых терминов с датами в прошлом.Так что Термины могут только естественным образом становиться старше, и не могут быть созданы, как в прошлом пользователем.Я считаю, будет ли правильно работать @ Future в даты начала / окончания Term .

Это сложно проверить в приложении во время разработки, так как мне нужно подождать, пока Срок не станет старше, а затем переместиться Транзакция в Историческая транзакция .

...