You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@openjpa.apache.org by jsmch <js...@web.de> on 2008/11/01 12:23:13 UTC

Problems with openjpa on foreign keys (says "no field named in class")

Hello,

i´ve problems with foreign-key-crossreferences using geronimo.

I try using a Query
        Query q = em.createQuery("SELECT u FROM ChatUserLoggedIn u where
u.chatroomid = null");
        List resultList = q.getResultList();
        List<ChatUserLoggedIn> list = resultList;
        return list;

My involved/affected entities look like this:
======================================
@Entity
public class ChatUserLoggedIn implements Serializable {
       
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private int id;

        @ManyToOne
        @JoinColumn(name="userid")
        private ChatUser user;

        @ManyToOne
        @JoinColumn(name="chatroomid", nullable=true)
        private ChatRoom room;

        private static final long serialVersionUID = 1L;
...
======================================
@Entity
public class ChatUser implements Serializable{
        private static final long serialVersionUID = 1L;
       
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private int id;
       
        @Column(length=20)
        private String username;
       
        @Column(length=20)
        private String password;
        @Temporal(TemporalType.TIMESTAMP)
        Date date;
        Date login;
       
        @ManyToOne
        @JoinColumn(name="roleid")
        private Role role;
       
        @OneToMany(mappedBy="user", cascade=CascadeType.REMOVE)
        private  List<ChatUserLoggedIn> chatuserloggedin;
...
========================================
Therefore the database has fields id, userid and chatroomid in the
chatuserloggedin-table.
But the result in executing this query is:
------------------------------------------------
11:41:27,937 OFF   [standard]
-----------------------------------------------------------------------------------------
<openjpa-1.0.3-r420667:677674 nonfatal user error>
org.apache.openjpa.persistence.ArgumentException: An error occurred while
parsing the query filter "SELECT u FROM ChatUserLoggedIn u where
u.chatroomid = null". Error message: No field named "chatroomid" in class
"class chat.entities.ChatUserLoggedIn".
        at
org.apache.openjpa.kernel.exps.AbstractExpressionBuilder.parseException(AbstractExpressionBuilder.java:118)
        at
org.apache.openjpa.kernel.exps.AbstractExpressionBuilder.traversePath(AbstractExpressionBuilder.java:284)
        at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getPath(JPQLExpressionBuilder.java:1313)
        at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getPathOrConstant(JPQLExpressionBuilder.java:1268)
        at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.eval(JPQLExpressionBuilder.java:866)
        at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getValue(JPQLExpressionBuilder.java:1362)
        at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getValue(JPQLExpressionBuilder.java:1348)
        at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.eval(JPQLExpressionBuilder.java:759)
        at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getExpression(JPQLExpressionBuilder.java:1339)
        at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.eval(JPQLExpressionBuilder.java:709)
        at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.evalWhereClause(JPQLExpressionBuilder.java:484)
        at
org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.getQueryExpressions(JPQLExpressionBuilder.java:264)
        at
org.apache.openjpa.kernel.jpql.JPQLParser.eval(JPQLParser.java:61)
        at
org.apache.openjpa.kernel.ExpressionStoreQuery$DataStoreExecutor.<init>(ExpressionStoreQuery.java:656)
        at
org.apache.openjpa.kernel.ExpressionStoreQuery.newDataStoreExecutor(ExpressionStoreQuery.java:165)
        at
org.apache.openjpa.kernel.QueryImpl.createExecutor(QueryImpl.java:728)
        at
org.apache.openjpa.kernel.QueryImpl.compileForDataStore(QueryImpl.java:686)
        at
org.apache.openjpa.kernel.QueryImpl.compileForExecutor(QueryImpl.java:668)
        at
org.apache.openjpa.kernel.QueryImpl.getOperation(QueryImpl.java:1487)
        at
org.apache.openjpa.kernel.DelegatingQuery.getOperation(DelegatingQuery.java:123)
        at
org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:227)
        at
org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:277)
        at
chat.entities.access.DataAccessService.getOnlineUser(DataAccessService.java:558)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at
org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:158)
        at
org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:141)
        at
org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:67)
        at
org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:210)
        at
org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:188)
        at
org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:165)
        at
org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:217)
        at
org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:77)
        at
org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:321)
        at
org.apache.openejb.util.proxy.Jdk13InvocationHandler.invoke(Jdk13InvocationHandler.java:49)
        at $Proxy62.getOnlineUser(Unknown Source)
        at chat.kernel.impl.Client.isUserOnline(Client.java:275)
        at chat.kernel.impl.Client.login(Client.java:85)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at
org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:158)
        at
org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:141)
        at
org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:67)
        at
org.apache.openejb.core.stateful.StatefulContainer._invoke(StatefulContainer.java:451)
        at
org.apache.openejb.core.stateful.StatefulContainer.businessMethod(StatefulContainer.java:413)
        at
org.apache.openejb.core.stateful.StatefulContainer.invoke(StatefulContainer.java:271)
        at
org.apache.openejb.server.ejbd.EjbRequestHandler.doEjbObject_BUSINESS_METHOD(EjbRequestHandler.java:238)
        at
org.apache.openejb.server.ejbd.EjbRequestHandler.processRequest(EjbRequestHandler.java:129)
        at
org.apache.openejb.server.ejbd.EjbDaemon.processEjbRequest(EjbDaemon.java:164)
        at
org.apache.openejb.server.ejbd.EjbDaemon.service(EjbDaemon.java:122)
        at
org.apache.openejb.server.ejbd.EjbDaemon.service(EjbDaemon.java:84)
        at
org.apache.openejb.server.ejbd.EjbServer.service(EjbServer.java:60)
        at org.apache.openejb.server.ServicePool$2.run(ServicePool.java:78)
        at org.apache.openejb.server.ServicePool$3.run(ServicePool.java:101)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown
Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown
Source)
        at java.lang.Thread.run(Unknown Source)
------------------------------------------------
 
Perhaps there are problems with persistence.xml? It looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
        <persistence-unit name="chat" transaction-type="JTA">
                <description>ContainerManagedJPA</description>
               
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
                <jta-data-source>mySQLDatabasePool</jta-data-source>
                <non-jta-data-source>mySQLDatabasePool</non-jta-data-source>
                <class>chat.entities.Role</class>
                <class>chat.entities.ChatUserLoggedIn</class>
                <class>chat.entities.ChatUser</class>
                <class>chat.entities.ChatRoom</class>
                <class>chat.entities.Category</class>
                <properties>
                        <property name="openjpa.jdbc.SynchronizeMappings"
value="buildSchema(ForeignKeys=true)" />
                        </properties> ...

Any idea?

P.S.: Simple Queries on chatuser-table with selecting on name are no
problem. I´m also able to add new records to the database - but this
foreign-key-thing did not work yet (but with this configuration it already
worked under JBoss- this was the original app-environment...) 

P.P.S.: I also tried with using openjpa 1.2 in geronimo - the effect is the
same (certainly the trace starts with <openjpa-1.2.0 - but that´s all of
difference...)
-- 
View this message in context: http://n2.nabble.com/Problems-with-openjpa-on-foreign-keys-%28says-%22no-field-named-in-class%22%29-tp1441729p1441729.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.


Re: Problems with openjpa on foreign keys (says "no field named in class")

Posted by jsmch <js...@web.de>.
Thanks - that helped.
Obviosly the person who coded the original source did not use standards (but
i thought so).

Now that i use object-parameters it works very fine.


Dinkar Rao wrote:
> 
> With JPQL, it helps to think about classes and fields, rather than
> tables and columns. The query layer knows only about the fields and
> relationships you defined in your class, e,g,:
> 
> clas ChatUserLoggedIn {
>     ...
>     private ChatRoom room;
>     ...
> }
> 
> but not the column that represents the association between
> ChatUserLoggedIn and ChatRoom in your database schema ((chatroomid).
> 
> So, the query needs to check the room field:
> 
> "SELECT u FROM ChatUserLoggedIn u WHERE u.room IS NULL"
> 
> JPQL will do an implicit outer join for you between ChatUserLoggedIn
> and ChatRoom.
> 
> Not sure how it worked in the JBoss environment, because the original
> query has an equality comparision for null ("...where u.chatroomid =
> null"), which is undefined.
> 
> Thanks
> Dinkar
> 
> 

-- 
View this message in context: http://n2.nabble.com/Problems-with-openjpa-on-foreign-keys-%28says-%22no-field-named-in-class%22%29-tp1441729p1473916.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.


Re: Problems with openjpa on foreign keys (says "no field named in class")

Posted by Dinkar Rao <di...@gmail.com>.
With JPQL, it helps to think about classes and fields, rather than
tables and columns. The query layer knows only about the fields and
relationships you defined in your class, e,g,:

clas ChatUserLoggedIn {
    ...
    private ChatRoom room;
    ...
}

but not the column that represents the association between
ChatUserLoggedIn and ChatRoom in your database schema ((chatroomid).

So, the query needs to check the room field:

"SELECT u FROM ChatUserLoggedIn u WHERE u.room IS NULL"

JPQL will do an implicit outer join for you between ChatUserLoggedIn
and ChatRoom.

Not sure how it worked in the JBoss environment, because the original
query has an equality comparision for null ("...where u.chatroomid =
null"), which is undefined.

Thanks
Dinkar