[jboss-jira] [JBoss JIRA] (AS7-4576) No ConstraintViolationException thrown by EntityManager persist upon pre-persist constraint violation
Marek Schmidt (JIRA)
jira-events at lists.jboss.org
Mon Apr 23 11:21:18 EDT 2012
[ https://issues.jboss.org/browse/AS7-4576?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12686693#comment-12686693 ]
Marek Schmidt commented on AS7-4576:
------------------------------------
My understanding of the spec is that transaction doesn't have to do anything with it... The PrePersist method is always invoked as part of the persist operation (Per 3.5.2), and automatic validation should occur immediately after the PrePersist invocations. I don't see how the spec would allow me to return from entityManager.persist(foo) if foo is invalid.
If you look at the @PrePersit example in the spec (3.5.3 Example), you'll notice the @PrePersist being used for some kind of validation and throwing "AccountException". I understand the 3.6.1. as a kind of implicit @PrePersist listener using bean validation, so it makes sense to run at the same time as (or, "immediately after") other @PrePersist listeners.
My understanding could be wrong, of course...
> No ConstraintViolationException thrown by EntityManager persist upon pre-persist constraint violation
> -----------------------------------------------------------------------------------------------------
>
> Key: AS7-4576
> URL: https://issues.jboss.org/browse/AS7-4576
> Project: Application Server 7
> Issue Type: Bug
> Components: JPA / Hibernate
> Affects Versions: 7.1.1.Final
> Environment: as7.1.2-SNAPSHOT (2012-04-20) c525e538fda12bde76b44a6db4f61d55105c1cea, hibernate4
> Reporter: Marek Schmidt
> Assignee: Scott Marlow
> Attachments: jboss-as-kitchensink.war
>
>
> Per JPA 2.0 spec 3.6.1.2 Requirements for Automatic Validation upon Lifecycle Events, the "persistence provider must throw the javax.validation.ConstraintViolationException" ... and the validation must occur "immediately after the point" where callback method invocations, such as PrePersist have been completed.
> Having a Member entity with some @NonNull validator present on one of its fields, the following test shows the javax.validation.ConstraintViolationException is not thrown while invoking persist, but later inside flush():
> {code}
> try {
> System.out.println("XXX: before em.persist()");
> em.persist(new Member());
> System.out.println("XXX: after em.persist()");
> em.flush();
> System.out.println("XXX: after em.flush()");
> }
> catch(javax.validation.ConstraintViolationException x) {
> System.out.println("XXX: Constraint violation!");
> }
> {code}
> {code}
> @Entity
> @XmlRootElement
> @Table(uniqueConstraints = @UniqueConstraint(columnNames = "email"))
> public class Member implements Serializable {
> ...
> @NotNull
> @NotEmpty
> @Email
> private String email;
> ...
> @PrePersist
> public void prePersist() {
> System.out.println("XXX: prePersist");
> }
> }
> {code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list