You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Oliver Ringel (JIRA)" <ji...@apache.org> on 2011/03/02 20:23:36 UTC

[jira] Commented: (OPENJPA-1787) Bean validation fails merging a new entity

    [ https://issues.apache.org/jira/browse/OPENJPA-1787?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13001564#comment-13001564 ] 

Oliver Ringel commented on OPENJPA-1787:
----------------------------------------

I finally found the place in the source code where the data gets lost.

If you merge a new entity the BrokerImpl first tries to attach the entity via the AttachManager.
The AttachManager uses an AttachStrategy to persist the new entity. 

Here ist the code snippet from the org.apache.openjpa.kernel.AttachStrategy class with my comments

    protected StateManagerImpl persist(AttachManager manager,
        PersistenceCapable pc, ClassMetaData meta, Object appId, 
        boolean explicit) {
        PersistenceCapable newInstance;

        if (!manager.getCopyNew())
            newInstance = pc;                                                                       <--- calling this would fix the issue 
        else if (appId == null) {
            newInstance = pc.pcNewInstance(null, false);                                <--- but this is called, pc.pcNewInstance returns an new instance, person.name is set to null
	}
        else
            newInstance = pc.pcNewInstance(null, appId, false);

        return (StateManagerImpl) manager.getBroker().persist                       <-- this calls finally BrokerImpl.persistInternal(...) and fails because person.name is null  
            (newInstance, appId, explicit, manager.getBehavior());
    }

For my testcases this issue could be fixed by replacing the first if statement with "if (manager.getCopyNew())".
I'm absolutely not sure, if it is really that easy. I guess not.

Maybe another good place to fix the problem is EntityManagerImpl.merge() which also sets the AttachManager's copyNew flag.

Please could someone with more insight into openjpa verify this solution.
Thanks.

> Bean validation fails merging a new entity
> ------------------------------------------
>
>                 Key: OPENJPA-1787
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1787
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: jpa, kernel
>    Affects Versions: 2.0.1, 2.1.0, 2.2.0
>            Reporter: Oliver Ringel
>            Priority: Critical
>         Attachments: com.example.TestEmployeeDAO.txt, openjpa-1787.tar, testcase-openjpa-1787.tar
>
>
> The bean validation is not working correctly
> If you try to merge a new entity.
>         EntityManager em = entityManagerFactory.createEntityManager();
>         Person person = new Person();
>         person.setName("Oliver");                               // Employee.name is annotated @NotNull 
>         person = em.merge(person);                            
> you get a ConstraintValidationException, although name is set. 

-- 
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira