Alain -

I looked at your unit test and the reason that an extra update is being
sent to the database is because you're updating your Entity in the
@PreUpdate method. If you didn't update that field, no update would be
issued. That being said, I think we're getting down to the real problem.

I don't think @PreUpdate should be called in this instance because even
though Parent is dirty, it doesn't result in a DB update and as such,
@PreUpdate shouldn't be invoked. I thought we had a feature to control this
behavior, but I'm struggling to find it right now.

I'll attach my unit test for future reference.

Thanks,
Rick


On Tue, Mar 25, 2014 at 9:22 AM, Alain Brazeau <abraz...@rogers.com> wrote:

> Hi Rick,
>
> As requested, here is a test I wrote in the 'openjpa-persistence-jdbc'
> project:
>
>
> package org.apache.openjpa.persistence.jdbc.update;
>
> import java.util.Date;
>
> import javax.persistence.EntityManager;
>
> import org.apache.openjpa.persistence.test.SingleEMFTestCase;
>
>
> public class TestCascadePersist extends SingleEMFTestCase {
>
>     public void setUp() throws Exception {
>         super.setUp(CLEAR_TABLES, Parent.class, Child.class);
>     }
>
>
>     public void testAddChildShouldNotUpdateParent() {
>         EntityManager em = emf.createEntityManager();
>
>         em.getTransaction().begin();
>         Parent parent = new Parent();
>         parent.setName("parent");
>         em.persist(parent);
>         em.getTransaction().commit();
>
>         long parentId = parent.getId();
>         Date expectedLastModifiedDate = parent.getLastModifiedDate();
>
>         em.getTransaction().begin();
>         parent = em.find(Parent.class, parentId);
>         parent.newChild("child");
>         em.getTransaction().commit();
>
>         Date actualModifiedDate = parent.getLastModifiedDate();
>
>         assertEquals("The last modified date should not change.",
>                      expectedLastModifiedDate.getTime(),
> actualModifiedDate.getTime());
>     }
>
> }
>
>
> In order for the test to work, the following instance variable and methods
> have to be added to the
> existing org.apache.openjpa.persistence.jdbc.update.Parent class:
>
>
>     private Date lastModifiedDate;
>
>     public Date getLastModifiedDate() {
>         return lastModifiedDate;
>     }
>
>     @PrePersist
>     @PreUpdate
>     public void onUpdate() {
>         this.lastModifiedDate = new Date();
>     }
>
>
> Thanks!
>
> Alain
>
>
>
> --
> View this message in context:
> http://openjpa.208410.n2.nabble.com/Unecessary-database-update-tp7586121p7586153.html
> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>



-- 
*Rick Curtis*

Reply via email to