On Mar 30, 2009, at 11:46 PM, coloradoflyer wrote:
I missed these last 2 comments. First, I really don't want this to
be a
stateful bean, there is no state in here and it should not be using
that
resource.
That's ok. I mentioned that as you said you ran the same code with
OpenJPA directly and didn't see the same issue. In that scenario you
were likely using the same EntityManager for all persistence
operations and avoiding the detach as a result, which is definitely a
state-based approach. If you wanted things to run the same way, an
EXTENDED persistence context is equivalent to that scenario.
Alternatively increasing the scope of the JTA transaction would have
the same effect; lifecycle of a TRANSACTION persistence context is
tied to the transaction, which will be one transaction per EJB call
(and hence one EntityManager instance per call) unless there is a
larger transaction to tie those EJB invocations together.
Regardless, the detach approach should work fine. I'm not sure what
might be going on with the detached object merge. Cc'ing the OpenJPA
list as they might have a better idea.
For their benefit here's the sample app that reproduces the detach/
merge issue: http://www.nabble.com/file/p22509703/testerror.jar
-David
The entity I'm passing into the method to be merged is fully
hydrated and
just being updated, should I use something other than merge to
update the
object? It is for sure detached.
Second, This was not using a lazy loaded value, remember, when it was
loaded, I saw a value, but when I went in to merge (update) the
entity it
did the update in the db, but the value came back as empty. It
seems like a
problem that when a merge is done an attribute is lazy loaded? but
when
query/load the attribute is not lazy loaded.
-chris
Jonathan Gallimore-2 wrote:
You're absolutely spot on David, making those changes worked here. I
didn't even think of that, oops! Perhaps we could add a warning to
the
JtaEntityManager if the entity is detached, assuming that's
something we
could detect?
Jon
David Blevins wrote:
Haven't had a chance to look at the issue, but it's starting to
sound
like a detach. Per spec, when the transaction ends, all objects
pulled from a TRANSACTION scoped PersistenceContext are detached and
no more data will be read into them. This can lead to strange state
as most vendors do lazy loading and therefore any fields not loaded
after the detach will stay unset.
Try switching your Stateless bean to a Stateful and changing your
PersistenceContextType.TRANSACTION to
PersistenceContextType.EXTENDED.
-David
On Mar 16, 2009, at 2:00 PM, Jonathan Gallimore wrote:
Yes, you did mention that - should help narrow down the problem ;-)
I tried your code with both HSQLDB and Postgresql with the same
result on both. org.apache.openejb.persistence.JtaEntityManager is
the class that gets injected into _entityManager in your Session
bean, and this is a wrapper around the OpenJPA entity manager. I'm
wondering whether we're setting something up differently to how
you're using OpenJPA on its own. I'm currently checking out OpenJPA
to delve into this further.
Cheers
Jon
coloradoflyer wrote:
Hi Jon,
Thanks for your help. I'm not sure if I mentioned this or not,
but
I did
try this out in a test case using only openjpa and I did not see
the
same
behavior. I did not try it using any other database, but I don't
think this
is a problem in that part of the code. I did look at the sql
generated, and
it looks like all of the columns are being selected. One other
thing I did,
I downloaded the openejb source, and started looking through it,
but
I'm not
familiar with the code at all and was hoping the problem would
manifest
itself in my code somewhere.... Thanks for your help, please
let me
know
when you find the problem.
-chris
Jonathan Gallimore-2 wrote:
I've managed to reproduce the issue with your code (many thanks
for
that!). I'm not sure why its happening, your code looks ok to me,
so I'm going to dig deeper to try and figure out what's going on.
Cheers
Jon
coloradoflyer wrote:
Hi Jon/all,
I attached a jar with the test case. Basically, there are 5
source files
in
here and a sql script to create the entities.
The interface for the stateless session bean, the concrete class
for it.
The 2 Entites, and the Test case. Its pretty small.
If you take a look at the test case, if it passes, that in
itself
displays
the problem. The test case is TestAudioServices, and the line
that
**should** fail is line 40, it looks for null for the name of
the
status
(which should never be null). The proof that this case
displays the
problem, is on line 43, basically line 42 reloads the entity by
its id,
and
then checks to see if the status now is not null, one of those 2
lines
(41
or 43) should fail.
These are the lines in question:
file = stateless.update(file);
assertNull(file.getAudioFileStatus().getName());
file = stateless.findById(file.getId());
assertNotNull(file.getAudioFileStatus().getName());
Thanks for looking into this, I keep thinking I'm going to find
something
wrong in my code, but I'm not seeing it so far, and its
relatively
trivial
now.
http://www.nabble.com/file/p22509703/testerror.jar testerror.jar
-chris
--
View this message in context:
http://www.nabble.com/openejb3.1-merge-tp22469332p22799300.html
Sent from the OpenEJB User mailing list archive at Nabble.com.