]
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: