Dain,
If you've tried these variations, then it sure sounds like a bug.  Go ahead
and create a JIRA report.  Even if we determine an alternate solution or
answer, at least it will be documented.  Thanks.

Kevin

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

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