Thanks for taking a look at this. I tried adding a flush after the remove but the test fails at the same location. I also tried commenting out the merge calls, but it fails at the same point.

Any ideas?  Do you think it is a bug?

-dain

On May 29, 2007, at 11:50 AM, Kevin Sutter wrote:

Hi Dain,
Your nudge worked... I noticed your append last week, but didn't act on
it.  If I remember correctly, I think there are some nuances with our
merge() processing. From what I can tell, your example doesn't explicitly require the merge() invocations (although they shouldn't hurt). I have a few inline comments below... I haven't tried your specific example yet,
just some observations...  Thanks.

Kevin

On 5/29/07, Dain Sundstrom <[EMAIL PROTECTED]> wrote:

^nudge

-dain

On May 24, 2007, at 8:13 PM, Dain Sundstrom wrote:

> I have a piece of code that effectively does the same thing the
> following test does:
>
>     private void newDeleteNew() throws Exception {
>         beginTx();
>
>         // Create new
>         Person dain = new Person();
>         dain.setName("dain");
>         assertFalse(entityManager.contains(dain));
>         entityManager.persist(dain);
>         entityManager.flush();
>         dain = entityManager.merge(dain);


This merge() call should not be required since you have already done the
persist().

        assertTrue(entityManager.contains(dain));
>
>         // Find and verify
>         dain = entityManager.find(Person.class, "dain");
>         assertNotNull(dain);
>         assertEquals("dain", dain.getName());
>
>         // Delete
>         entityManager.remove(dain);
>         assertFalse(entityManager.contains(dain));


This part confused me. A remove() shouldn't remove the entity from the persistence context. Also, does your example run any differently if you do
a flush() after the remove()?


>         // Recreate
>         dain = new Person();
>         dain.setName("dain");
>         assertFalse(entityManager.contains(dain));
>         entityManager.persist(dain);
>         entityManager.flush();
>         dain = entityManager.merge(dain);


Here again, there should be no need for the merge()...

        assertTrue(entityManager.contains(dain));
>
>         // Find and verify
>         dain = entityManager.find(Person.class, "dain");
>         assertNotNull(dain); // <<<<<<< FAILS


Even with the above comments, this failure confuses me.  Since we have
persisted and flushed the "dain" object, we should be able to find it...

The only thing that I wonder about is that since you didn't do the flush after the remove, then it's processing the persist first and then the remove operation. But, according to section 3.2.1 of the JPA spec, it says that if persist() is invoked on a removed entity, it becomes managed. I can't find
a reference in the spec that indicates the order of the operations at
commit/flush time.

        assertEquals("dain", dain.getName());
>
>         commitTx();
>     }
>
> The test fails at the marked point, because the entityManager seems
> to think the "dain" entity is still deleted.  I assume this type of
> code would work.  Is this a bug or is my assumption wrong?
>
> BTW, I'm using 0.9.8-incubating-SNAPSHOT
>
> And here is my entity class:
>
> @Entity
> public class Person {
>     private String name;
>
>     @Id
>     public String getName() {
>         return name;
>     }
>
>     public void setName(String name) {
>         this.name = name;
>     }
> }
>
> Thanks,
>
> -dain



Reply via email to