I wrote the smallest possible test case to demonstrate the problem (the undesired updates after the commit on a transaction that only had reads).

I discovered that the way I was managing Spring Framework's transaction handling was causing my problem.

I thought I had to supply the Spring Framework transaction manager with the EntityManager that I was using for a thread outside Spring. However, I don't need to. It's enough to give Spring the EntityManagerFactory.

The call to the Spring internals with the EntityManager causes the problem, although I'm not likely to have time to check out why. This is how I was doing it:

TransactionSynchronizationManager.bindResource(
        entityManagerFactory, new EntityManagerHolder(entityManager));

In this way I was assuming that Spring would use this entityManager, however for reasons unknown Spring's JpaTransactionManager was ignoring this entityManager and calling the EntityManagerFactory to get another - the EMF is injected into JpaTransactionManager in the IoC config (from my ContextManager):

  <bean id="transactionManager"
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory">
      <bean class="org.permacode.patternrepo.ContextManager"
        factory-method="getEntityManagerFactory" />
    </property>
  </bean>


So OpenJPA's EntityManagerFactory provides a single EntityManager to a single thread - presumably storing it in a ThreadLocal - rather than creating a new one with entityManagerFactory.createEntityManager().

I presume this is an OpenJPA feature, because I didn't find it in the persistence specification.

What do you OpenJPA developers think?


thanks
Adam



Adam Hardy on 19/12/07 12:53, wrote:
Will an Eclipse project be fine for the OpenJPA developers? How about the lib jars? Will m2eclipse and maven be acceptable (certainly would be easiest)?

Marc - are you using Spring Framework transaction management?

regards
Adam

Marc Siegel on 18/12/07 14:44, wrote:
It would be worth it to some of us users. Anything that could be done
to get this fixed would help many people.

-Marc

On Dec 17, 2007 6:34 PM, Adam Hardy <[EMAIL PROTECTED]> wrote:
I also had a situation where OpenJPA fired updates on unchanged entities after
committing the transaction, for all fields all the time.

For instance, one pojo only had 2 string fields and a Long primary key. OpenJPA
updated both string fields after the commit.

I'm using the extended persistence context without any versioning, and the only
configuration I set is the JDBC connection properties.

Unfortunately I fixed it without figuring out where exactly the problem was. Sorry. I think what I had done is to begin a transaction, commit it, and then start another and whatever I pulled into the second transaction, OpenJPA did an
update on.

If you think this is worth putting a test case together for, let me know. I wasn't quite sure whether running a second transaction after the first on the
same entity manager was legitimate according to the JPA spec.


Shelley <[EMAIL PROTECTED]> writes:
I am seeing a similar issue with OpenJPA unnecessarily calling an UPDATE on
every commit.

It appears that on every commit(), all of my entity's Date fields
(TemporalType.TIMESTAMP) are being updated even though they have not
changed.

UPDATE MY_ENTITY SET timeField = ?, version = ? WHERE id = ? AND version = ? [params=(Timestamp) 2007-12-05 15:08:18.927, (int) 2, (int) 50, (int) 1]

My current workaround is to clear the persistence context after each commit, but this obviously is not desirable and shouldn't be necessary. Any ideas as to why this might be occurring, or how to prevent it? I am using the
majority of default OpenJPA properties (version LockManager, optimistic
locking, etc), although I have attempted to modify some of these properties
to prevent this problem, so far with no success.



Reply via email to