[hibernate-issues] [Hibernate-JIRA] Commented: (HV-281) validation of a persisted map

Vladimir Klyushnikov (JIRA) noreply at atlassian.com
Wed Mar 3 05:10:47 EST 2010


    [ http://opensource.atlassian.com/projects/hibernate/browse/HV-281?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=35717#action_35717 ] 

Vladimir Klyushnikov commented on HV-281:
-----------------------------------------

Hi,

I was struggling with this issue all past day. Bad news that this is behaviour by design and it is used to merge entities with collections of other entities that use assigned identifiers (IMHO). But it leads to really annoying problems. First is the issue that is mentioned in description and the second is that merging transient entity with collection executes INSERT and subsequent UPDATE of same entity. I use auditing of my entity and don't need this update.
Good news that I've found a simple workaround. It will work only with generated IDs and it is ok for me. I've developed a custom merge listener and registered it:
{code}
public class CollectionHandlingMergeEventListener extends DefaultMergeEventListener {

    @Override
    protected void copyValues(EntityPersister persister, Object entity, 
        Object target, SessionImplementor source,
        Map copyCache, ForeignKeyDirection foreignKeyDirection) {
        if (foreignKeyDirection != ForeignKeyDirection.FOREIGN_KEY_TO_PARENT) {
             Object[] copiedValues = TypeFactory.replace(
                    persister.getPropertyValues(entity, source.getEntityMode()),
                    persister.getPropertyValues(target, source.getEntityMode()),
                    persister.getPropertyTypes(),
                    source,
                    target,
                    copyCache
            );
            persister.setPropertyValues(target, copiedValues, source.getEntityMode());
        }
    }
}
{code}
Of course, it is a hack. Hope core contributors will find a better way to solve these issues.


> validation of a persisted map
> -----------------------------
>
>                 Key: HV-281
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HV-281
>             Project: Hibernate Validator
>          Issue Type: Bug
>         Environment: hibernate-core 3.5.0-Beta-3
> Validator 4.0.1.GA
> MySQL 5.1
>            Reporter: thogau
>         Attachments: mapValidation.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