ERLEDIGT
NEIN
NEIN
ANTWORTEN
6
6
ZUGRIFFE
7149
7149
EMPFEHLEN
-
27.05.05 11:04 #1
Mitglied
- Registriert seit
- May 2005
- Beiträge
- 23
Hallo zusammen,
ich arbeite mit Container Managed Persistence-Beans in der Version 2.0 unter JBoss 4.0 auf Windows XP Prof. Beim Deployment auf den Server erhalte ich folgende Fehlermeldung:
2005-05-27 10:30:13,316 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.parentTraceEnabled=true
2005-05-27 10:30:13,316 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.nestedTraceEnabled=false
2005-05-27 10:30:13,316 DEBUG [org.jboss.util.NestedThrowable] org.jboss.util.NestedThrowable.detectDuplicateNesting=true
2005-05-27 10:30:13,316 ERROR [org.jboss.ejb.EntityContainer] Starting failed jboss.j2ee:jndiName=CmpL001PcDeEjb,service=EJB
org.jboss.deployment.DeploymentException: Error compiling EJB-QL statement 'SELECT OBJECT(a) FROM CmpL003PcTrSchema as a WHERE LENGTH(a.level003_pc_id) = ?1 AND a.level003_pc_id LIKE ?2'; - nested throwable: (org.jboss.ejb.plugins.cmp.ejbql.ParseException: Encountered "a.level003_pc_id" at line 1, column 61.
Was expecting one of:
"CONCAT" ...
"SUBSTRING" ...
"(" ...
<STRING_LITERAL> ...
<STRING_VALUED_PARAMETER> ...
<STRING_VALUED_PATH> ...
)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCEJBQLQuery.<init>(JDBCEJBQLQuery.java:52)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCCommandFactory.createEJBQLQuery(JDBCCommandFactory.java:60)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCQueryManager.start(JDBCQueryManager.java:272)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.startStoreManager(JDBCStoreManager.java:490)
at org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager.start(JDBCStoreManager.java:381)
at org.jboss.ejb.plugins.CMPPersistenceManager.start(CMPPersistenceManager.java:157)
at org.jboss.ejb.EntityContainer.startService(EntityContainer.java:340)
at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:272)
at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:222)
at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
...............
...............
Folgende Einträge wurden von mir vorgenommen:
In der Home-Schnittstelle:
public java.util.Collection findByRequirements(int length,java.lang.String flag)
throws javax.ejb.FinderException,java.rmi.RemoteException;
Im ejb-jar.xml-Deskriptor:
<query>
<query-method>
<method-name>findByRequirements</method-name>
<method-params>
<method-param>int</method-param>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<ejb-ql><![CDATA[SELECT OBJECT(a) FROM CmpL003PcDeSchema as a WHERE LENGTH(a.level003_pc_id) = ?1 AND a.level003_pc_id LIKE ?2]]></ejb-ql>
</query>
Soweit ich weiss gibt es in der Home-Schnittstelle mit der Übergabe von primitiven Datentypen (int) keine Probleme.
Eine mögliche Lösung die ich in den Foren gefunden habe ist die Implementierung von Declared-SQL statt der Query die ich im Deskriptor verwende.
Beispiel:
<declared-sql>
<select><alias>a</alias></select>
<where>WHERE LENGTH(a.level003_pc_id = {0}) AND a.level003_pc_id LIKE {1}</where>
<order></order>
</declared-sql>
Ich setze als Datenbank MySQL v4.0 ein.
Kann jemand helfen? Danke im Voraus.
-
27.05.05 11:06 #2
Mitglied
- Registriert seit
- May 2005
- Beiträge
- 23
sorry, habe vergessen zu schreiben, das die Declared-SQL-Methode nicht funktioniert hat. Beim Deployment kommt die Fehlermeldung, das kein Bezug zwischen der Methode und dem Deskriptor bestehen würde.
-
27.05.05 11:20 #3
Hallo!
Code :1
SELECT OBJECT(a) FROM CmpL003PcTrSchema as a WHERE LENGTH(a.level003_pc_id) = ?1 AND a.level003_pc_id LIKE ?2
Ist a.level003_pc_id auch ein String kompatibler Typ?
Gruß TomJava rocks! http://www.jugsaar.de
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
27.05.05 13:38 #4
Hallo!
Also unter JBoss 3.2.7 funktioniert folgendes einwandfrei:
PersonBean -> Local CMP EntityBean
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
/* * Created on 27.05.2005@12:20:20 by Darimont * * TODO Licence info */ package de.tutorials.ejb.domain; import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBException; import javax.ejb.EntityBean; import javax.ejb.EntityContext; import javax.ejb.RemoveException; /** * @author Darimont * * TODO Explain me * @ejb.bean description="PersonBean" * display-name="PersonBean" * local-jndi-name="PersonHomeLocal" * name="Person" * primkey-field="id" * type="CMP" * view-type="local" cmp-version = "2.x" * @ejb.value-object generatePKConstructor = "true" * * @ejb.finder signature = "Person findPersonByName(java.lang.String name)" * description = "Find Person by Name" query = "SELECT OBJECT(p) FROM Person AS p WHERE p.lastName=?1" * @ejb.finder signature = "Person findPersonByNameWithLen(java.lang.String name,int len)" * description = "Find Person by Name" query = "SELECT OBJECT(p) FROM Person AS p WHERE p.lastName=?1 AND LENGTH(p.lastName)=?2" * * * @jboss.persistence create-table = "true" datasource = "java:/MySqlDS" datasource-mapping = "mySQL" table-name = "Person" * @jboss.entity-command name = "mysql-get-generated-keys" * @jboss.unknown-pk auto-increment = "true" column-name = "id" */ public abstract class PersonBean implements EntityBean { /** * @ejb.create-method view-type = "local" * * @param id * @return * @throws CreateException */ public Integer ejbCreate() throws CreateException { return null; } public void ejbPostCreate() throws CreateException {} /** * @ejb.interface-method * @ejb.pk-field * @ejb.persistence column-name = "id" * @return */ public abstract Integer getId(); /** * @ejb.interface-method * @return */ public abstract void setId(Integer id); /** * @ejb.interface-method * @ejb.persistence column-name = "lastname" * @return */ public abstract String getLastName(); /** * @ejb.interface-method * @return */ public abstract void setLastName(String lastName); public void ejbActivate() throws EJBException, RemoteException { } public void ejbLoad() throws EJBException, RemoteException { } public void ejbPassivate() throws EJBException, RemoteException { } public void ejbRemove() throws RemoveException, EJBException, RemoteException { } public void ejbStore() throws EJBException, RemoteException { } public void setEntityContext(EntityContext arg0) throws EJBException, RemoteException { } public void unsetEntityContext() throws EJBException, RemoteException { } }
Hier das passende ejb-jar.xml:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"> <ejb-jar > <description><![CDATA[No Description.]]></description> <display-name>Generated by XDoclet</display-name> <enterprise-beans> <!-- Session Beans --> <session > <description><![CDATA[PersonServiceBean]]></description> <display-name>PersonServiceBean</display-name> <ejb-name>PersonService</ejb-name> <home>de.tutorials.ejb.generated.PersonServiceHome</home> <remote>de.tutorials.ejb.generated.PersonService</remote> <ejb-class>de.tutorials.ejb.service.PersonServiceBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> <!-- To add session beans that you have deployment descriptor info for, add a file to your XDoclet merge directory called session-beans.xml that contains the <session></session> markup for those beans. --> <!-- Entity Beans --> <entity > <description><![CDATA[PersonBean]]></description> <display-name>PersonBean</display-name> <ejb-name>Person</ejb-name> <local-home>de.tutorials.ejb.generated.PersonLocalHome</local-home> <local>de.tutorials.ejb.generated.PersonLocal</local> <ejb-class>de.tutorials.ejb.domain.PersonBean</ejb-class> <persistence-type>Container</persistence-type> <prim-key-class>java.lang.Integer</prim-key-class> <reentrant>False</reentrant> <cmp-version>2.x</cmp-version> <abstract-schema-name>Person</abstract-schema-name> <cmp-field > <description><![CDATA[]]></description> <field-name>id</field-name> </cmp-field> <cmp-field > <description><![CDATA[]]></description> <field-name>lastName</field-name> </cmp-field> <primkey-field>id</primkey-field> <query> <description><![CDATA[Find Person by Name]]></description> <query-method> <method-name>findPersonByName</method-name> <method-params> <method-param>java.lang.String</method-param> </method-params> </query-method> <ejb-ql><![CDATA[SELECT OBJECT(p) FROM Person AS p WHERE p.lastName=?1]]></ejb-ql> </query> <query> <description><![CDATA[Find Person by Name]]></description> <query-method> <method-name>findPersonByNameWithLen</method-name> <method-params> <method-param>java.lang.String</method-param> <method-param>int</method-param> </method-params> </query-method> <ejb-ql><![CDATA[SELECT OBJECT(p) FROM Person AS p WHERE p.lastName=?1 AND LENGTH(p.lastName)=?2]]></ejb-ql> </query> <!-- Write a file named ejb-finders-PersonBean.xml if you want to define extra finders. --> </entity> <!-- To add entity beans that you have deployment descriptor info for, add a file to your XDoclet merge directory called entity-beans.xml that contains the <entity></entity> markup for those beans. --> <!-- Message Driven Beans --> <!-- To add message driven beans that you have deployment descriptor info for, add a file to your XDoclet merge directory called message-driven-beans.xml that contains the <message-driven></message-driven> markup for those beans. --> </enterprise-beans> <!-- Relationships --> <!-- Assembly Descriptor --> <assembly-descriptor > <!-- To add additional assembly descriptor info here, add a file to your XDoclet merge directory called assembly-descriptor.xml that contains the <assembly-descriptor></assembly-descriptor> markup. --> <!-- finder permissions --> <!-- finder permissions --> <!-- transactions --> <!-- finder transactions --> </assembly-descriptor> </ejb-jar>
Gruß TomJava rocks! http://www.jugsaar.de
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
27.05.05 14:01 #5
Mitglied
- Registriert seit
- May 2005
- Beiträge
- 23
Hallo Tom,
danke für die schnelle Antwort. Ja, das Attribut level003_pc_id ist vom Typ java.lang.String.
Der Unterschied zu Deinem Quelltext liegt innnerhalb der Entity-Bean. Ich arbeite mit dem XDoclet-Klassengenerator und verwende Ant für das Deployment.
Sind in CMP v2.0 die Signatur von Finder-Methoden innerhalb der Entity Bean erforderlich? Falls ja, werden - kann ich mir denken - die Einträge in der die ejb-jar.xml-Datei überschrieben?
Soweit ich sehen konnte ist Deine ejb-jar.xml mit meiner identisch.
Danke und Gruss
Cengiz
-
27.05.05 14:18 #6
Hallo!
Ich arbeite auch mit XDoclet... siehe @ejb.blaDer Unterschied zu Deinem Quelltext liegt innnerhalb der Entity-Bean. Ich arbeite mit dem XDoclet-Klassengenerator und verwende Ant für das Deployment.
Innerhalb der EntityBean nicht ... finder-Methoden werden an den Home/LocalHome- Interfaces angegeben.Sind in CMP v2.0 die Signatur von Finder-Methoden innerhalb der Entity Bean erforderlich?
Über
* @ejb.finder signature = "Person findPersonByName(java.lang.String name)"
* description = "Find Person by Name" query = "SELECT OBJECT(p) FROM Person AS p WHERE p.lastName=?1"
generiere ich mit Xdoclet diese Methode am LocalHome:
Code :1 2
public de.tutorials.ejb.generated.PersonLocal findPersonByNameWithLen(java.lang.String name,int len) throws javax.ejb.FinderException;
Gruß TomJava rocks! http://www.jugsaar.de
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
27.05.05 15:29 #7
Mitglied
- Registriert seit
- May 2005
- Beiträge
- 23
Hallo,
also meine Home-Schnittstelle der CMP sieht wie folgt aus:
public com.de.ibais.viuna.cmp.pc.CmpL002PcDe create(java.lang.Long id , java.sql.Timestamp lastModify , java.lang.String pc , java.lang.String valid , java.lang.String description)
throws javax.ejb.CreateException,java.rmi.RemoteException;
public java.util.Collection findAll()
throws javax.ejb.FinderException,java.rmi.RemoteException;
public java.util.Collection findByRequirements(int length,java.lang.String flag)
throws javax.ejb.FinderException,java.rmi.RemoteException;
public com.de.ibais.viuna.cmp.pc.CmpL002PcDe findByPrimaryKey(java.lang.Long pk)
throws javax.ejb.FinderException,java.rmi.RemoteException;
Die ejb-jar.xml kennst du. Hier nochmal der Auszug:
<query>
<query-method>
<method-name>findByRequirements</method-name>
<method-params>
<method-param>int</method-param>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<ejb-ql><![CDATA[SELECT OBJECT(a) FROM CmpL003PcDeSchema as a WHERE LENGTH(a.level003_pc_id) = ?1 AND a.level003_pc_id LIKE ?2]]></ejb-ql>
</query>
Soweit ich weiss sind keine weiteren Einstellungen erforderlich. Die Fehlermeldung besteht leider wie bisher.
Idee(n) ?
Gruss und schönes Wochenende.
Cengiz
Ähnliche Themen
-
Richtige Syntax bei Operatorüberladung, wann sind "friend", "const", "&" nötig?
Von mrs_schokokeks im Forum C/C++Antworten: 4Letzter Beitrag: 25.08.10, 19:13 -
Eingabe in der timeline: "time*100" - bei Effekt "turbulentes Versetzen"-"Evolution"
Von MTMonline im Forum Videoschnitt, Videotechnik & -produktionAntworten: 2Letzter Beitrag: 25.04.08, 09:49 -
Mit "pattern", "matcher" und "replace" ein Fragezeichen ersetzen
Von Scrapy im Forum JavaAntworten: 8Letzter Beitrag: 01.12.05, 17:13 -
Fragen-paket: "SetInterval", "delete onEnterFrame", "for" UND etc ..
Von Leugim im Forum Flash PlattformAntworten: 4Letzter Beitrag: 10.10.05, 23:35 -
Datei-Eigenschaften: "erstellt:","Geändert am", "Letzter Zugriff:"
Von KILLSMAKER im Forum C/C++Antworten: 2Letzter Beitrag: 19.05.05, 19:51




Zitieren

Login