Is option #3 even possible within the JPA spec? One would need meta information about the
id property
(which generation type and how exactly this type behaves regarding the id generation
time). I don't think there
is a way to do this with the JPA api. Also JPA does not even explicitly define the
behavior of the different strategies.
Disabling the validation per default can also backfire in the cases where a user
"knows" that a certain strategy
will generate the id pre insert. In this case it would be valid to add @NotNull.
To me option #1 sounds best. Maybe #2, but I am not convinced that it is needed.
--Hardy
On May 15, 2012, at 10:22 AM, Emmanuel Bernard wrote:
There is an annoyance when using JPA and Bean Validation today. I
worked out a proposal. Please let me know what you think
http://beanvalidation.org/proposals/BVAL-234/
--- (copied here for convenience) ---
[Link to JIRA ticket][jira]
See also [NetBeans issue][netbeans]
## Problem description
Today when a property marked @Id @GeneratedValue is also marked @NotNull, it will fail if
the identity generation is post-insert
in the database. This can be the case if the underlying table is using column id
generation for example.
The id property is thus null when Bean Validation is executed during the pre-persist
phase and a constraint
violation is raised.
## Solutions
### 1. User adjusts
One option is to stay put and consider the behavior valid. The user can work around that
by:
- creating a `com.acme.groups.Created` group
- marking the `@NotNull` annotation as belonging to the group
- override the groups in `persistence.xml` to validate `Created` accordingly
Here is the snipped of the `persistence.xml` file
<property name="javax.persistence.validation.group.pre-persist"
value="javax.validation.groups.Default"/>
<property name="javax.persistence.validation.group.pre-update"
value="javax.validation.groups.Default,com.acme.groups.Created"/>
### 2 User adjusts with some help
We could use option 1 but have JPA provide the created group:
`javax.persistence.validation.groups.Created`
### 3. Have JPA disable validation of id properties at pre-persist
JPA could disable validation on id properties if in pre-persist and if the generated
value is not created yet.
Note that we disable all validations - not simply `@NotNull` - as it does not make much
sense to execute other
validations when a property is null.
`TraversableResolver` can be used to solve the problem as `isReachable` can stop the
processing of a property.
### Conclusions
Option 3 seems the most reasonable but it could be complicated at the JPA level.
Before going to the JPA EG, let's discuss the situation here.
### Questions remaining
- should the `Created` groups be renamed?
- is that correct to sneakily disable @NotNull constraint validation?
[netbeans]:
http://netbeans.org/bugzilla/show_bug.cgi?id=197845#c3
[jira]:
https://hibernate.onjira.com/browse/BVAL-234
_______________________________________________
beanvalidation-dev mailing list
beanvalidation-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/beanvalidation-dev