Hi Michael,
I see that you are running with 1.2.x of OpenJPA, so that's good.  I thought
that the problem you are describing was resolved eons ago.  It's one that I
hit very early on in my tenure with OpenJPA.  So, either the problem still
has a window associated with it, or it was accidentally re-introduced.

The problem is that the metadata associated with the Entities in the query
is not populated yet.  You are forcing this metadata to get populated by
doing one of your tricks (doing a find before the query, for example).

As I think about it more, maybe the "window" still exists in an application
server, but the original problem was resolved in standalone JSE mode.  Not
sure.  What application server are you using?  Does it provide the necessary
hooks for a JPA provider so that OpenJPA can properly enhance the classes at
startup?

I did a quick search in our JIRAs and found this one [1].  But, this seems
to be related to MappedSuperClasses and it seems to also fail in JSE.

There are also several postings to our forums with similar results [2], but
I'm not sure if these are the exact same scenario as yours.  Are you
pre-enhancing your Entities?  Or, are you relying on the container hook to
do the dynamic enhancing?  Or, are you relying on the runtime enhancement
(also known as sub-classing)?

More questions than answers, but I really thought this issue was resolved a
long time ago...
Kevin


[1]  https://issues.apache.org/jira/browse/OPENJPA-1043
[2]
http://n2.nabble.com/Starting-OpenJPA-during-container-startup-td210725.html#a210725

http://n2.nabble.com/RE%3A-Problem-with-openjpa-enhancer---using-runtime-enhancement-td1608390.html#a1608390

On Mon, May 25, 2009 at 7:29 AM, Michael Simons
<[email protected]>wrote:

> Hi,
>
> I've encountered a strange little problem here... When I do the
> following locally (in a simple application, not connected to an
> Application Server)...
>
> Query query =  em.createQuery("select u from LoginUser u where u.login =
> :loginname and u.passwd = :pass"); //$NON-NLS-1$
> //... setting Parameters...
> LoginUser user = null;
> try {
>        user = (LoginUser)query.getSingleResult ();
> } catch (NoResultException noResult) {
>        System.err.println("NoResult");
> }
>
> ... it works fine, it'll get me the correct "LoginUser" object. But when
> I try the same thing in a stateful EJB, the problems start. I'll get the
> following error:
>
> <openjpa-1.2.1-r752877:753278 nonfatal user error>
> org.apache.openjpa.persistence.ArgumentException: An error occurred
> while parsing the query filter "select u from LoginUser u where u.login
> = :loginname and u.passwd = :pass". Error message: The name "LoginUser"
> is not a recognized entity or identifier. Known entity names: []
>
> Funny thing, if I call something like...
>
> LoginUser user = (LoginUser)em.find(LoginUser.class, 1);
>
> ...before trying to create the query above, the whole thing will
> suddenly work, LoginUser seems to become a recognized Entity (which also
> shows, that my classes are correctly enhanced, that the EntityManager
> knows them correctly, etc.). It seems, that even though the
> EntityManager "knows" the LoginUser Entity (because I can "em.find(...)"
> it), it doesn't recognize it in a query.
>
> If I cast the Query to OpenJPAQuery and there set the ResultClass...
>
> if (query instanceof OpenJPAQuery) {
>        OpenJPAQuery opq = (OpenJPAQuery)query;
>        opq.setResultClass( LoginUser.class );
> }
>
> ...it suddenly seems to work. The big question is: Why is this needed?
> Is there a setting I can put into the (OpenJPA)EntityManager, that it
> will automatically recognize all of its entities in queries? Or do I
> really have to cast to OpenJPAQuery everytime I do a query?
>
> Regards,
>
> Michael (The original author Florian did not get a response from the list,
> after
> subscription-verification)
>
>

Reply via email to