[hibernate-issues] [Hibernate-JIRA] Commented: (HV-281) validation of a persisted map
Hardy Ferentschik (JIRA)
noreply at atlassian.com
Mon May 24 15:08:54 EDT 2010
[ http://opensource.atlassian.com/projects/hibernate/browse/HV-281?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=37264#action_37264 ]
Hardy Ferentschik commented on HV-281:
--------------------------------------
I had a closer look at the test code and it turns out that the "problem" is really a combination of using merge and identity.
Important to understand is that on a {{save()}} the original object gets persisted and hence passed as part of the {{PreInsertEvent}} to the {{BeanValidationListener}}. {{merge()}} is different in the sense that a new object graph get created. In this case the parent {{Parent}} must be persisted first. A new {{Parent}} instance get created and since it is a new entity the identifier must be generated. Since the identifier strategy is IDENTITY this can only happen with an insert. This insert is triggering the {{PreInsertEvent}} which is causing the validation to fail.
Really the best approach is to avoid {{GenerationType.IDENTITY}} since it has other drawbacks as well.
> validation of a persisted map
> -----------------------------
>
> Key: HV-281
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HV-281
> Project: Hibernate Validator
> Issue Type: Bug
> Components: engine
> Environment: hibernate-core 3.5.0-Beta-3
> Validator 4.0.1.GA
> MySQL 5.1
> Reporter: thogau
> Assignee: Hardy Ferentschik
> Fix For: 4.1.0
>
> Attachments: EntityWithCollection.java, mapValidation.zip, testcase.zip
>
>
> Hi,
> I am trying to validate an entity that holds a Map<K, V> of other persisted entities (just checking wether the map holds some predefined values).
> I can validate it "by hand" using validator.validate() and my map is correctly filled at validation time
> However when validation framework is called by persistence callbacks, my map is always empty...
> I am using Validator 4.0.1.GA and hibernate-core 3.5.0-Beta-2
> I tryed to pinpoint the problem and it seems that the map is not touched in the following method of AbstractType during the merge :
> {code}
> public Object replace(
> Object original, Object target, SessionImplementor session,
> Object owner, Map copyCache, ForeignKeyDirection foreignKeyDirection) throws HibernateException {
> boolean include;
> if ( isAssociationType() ) {
> AssociationType atype = (AssociationType) this;
> include = atype.getForeignKeyDirection()==foreignKeyDirection;
> }
> else {
> include = ForeignKeyDirection.FOREIGN_KEY_FROM_PARENT==foreignKeyDirection;
> }
> return include ? replace(original, target, session, owner, copyCache) : target;
> }
> {code}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list