Hi,

First of all, I've done research through the archives for the situation I am facing and found this:

http://mail-archives.apache.org/mod_mbox/openjpa-users/200706.mbox/[EMAIL 
PROTECTED]

I am facing the exact problem mentioned in that thread: I need to fetch an object several times from the database, whose columns are updated from another program and pick up the changes made by that program. However, I can't get OpenJPA to re-execute SQL and retrieve the object's new data from the database.

In the thread of the link I provide, I was lead to believe that em.refresh(obj) should do the trick. However, OpenJPA does not execute any SQL (I have SQL=TRACE in the log options and I only see one select statement) and keeps the old data in the object.

I use OpenJPA release 1.0.2 and the code snippet with which I test is the following:

=========================================================
EntityManagerFactory emFactory =
        Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
EntityManager em = emFactory.createEntityManager();

Record r = em.find(Record.class, 1);
System.out.println("VALUE: " + r.getStrField());

System.out.print("PRESS ENTER TO REDISPLAY...");
BufferedReader stdin = new BufferedReader(new InputStreamReader(
                System.in));
stdin.readLine();

// ------> PROBLEM AREA <------
em.refresh(r); // does not work
// ((OpenJPAEntityManager)em).evict(r); // also does not work
// em.clear(); // works but detaches everything
// em.close(); // ... re-create. works, costs too much
// ------> PROBLEM AREA <------

r = em.find(Record.class, 1);
System.out.println("VALUE: " + r.getStrField());
=========================================================

I change the strField of the "Record" object using a database editor before I press enter to re-fetch the value.

So, my question is, why does OpenJPA ignore the call to refresh() if the object is still attached? I don't see it as reasonable to detach all objects just to pick up a change in the database. I figured it may be a transaction isolation issue, but then did the following test which also did not work:

=========================================================
EntityManagerFactory emFactory =
        Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
EntityManager em = emFactory.createEntityManager();

em.getTransaction().begin();
Record r = em.find(Record.class, 1);
System.out.println("VALUE: " + r.getStrField());
em.getTransaction().commit();

System.out.print("PRESS ENTER TO REDISPLAY...");
BufferedReader stdin = new BufferedReader(new InputStreamReader(
                System.in));
stdin.readLine();

em.getTransaction().begin();
r = em.find(Record.class, 1);
em.refresh(r);
em.getTransaction().commit();
System.out.println("VALUE: " + r.getStrField());
=========================================================

So even when reading the object through 2 different transactions, I still can't get its data to be re-fetched...

Funilly enough, if i call rollback() on the transaction, it does work! However, it seems too much of a kludge to base my solution on that...

Thanks in advace to anyone who takes the time to help out.

Reply via email to