Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

EJB-Gehversuche mit JBoss und MySQL

4 views
Skip to first unread message

Thomas Porocnik

unread,
Jan 26, 2004, 4:25:10 AM1/26/04
to
Hallo,
hab mich jetzt mal zu Testzwecken an EJBs rangemacht.
wollte aber kein fertiges Sample deployen, sondern von Scratch und per
Hand da durch.

Verwende Jboss3.2.3/JDK1.4/mySQL4.1.
Hab mich dann so durchgegoogelt..

Aufbau meines Tests:
Ein (lokales) containermanaged EntityBean 'Person'; gehört zu einer
Tabelle 'Person' mit Feldern smallint und varchar.
Dann ein Sessionbean (Facade), von dem auf das EntityBean zugegriffen wird.
Ein Standalone-Client.

Aufgabe: Erzeugen einer 'Person' in der DB.

Anscheined funktioniert bis zum Create im Person-Bean erst mal alles.
Dort liefert der Trace dann ein ungültiges SQL-Statement:
'SELECT COUNT(*) FROM person WHERE'
Anscheinend will der Manager nachsehen, ob es den Eintrag schon gibt,
lässt aber die Klausel unvollständig.

Da die Tabelle in der DB schon vorher exisitierte, hab ich versucht im
ejb-jar.xml den Schema-Namen auf 'Personen'
zu ändern und nochmal zu deployen - die Tabelle müsste dann angelegt
werden (?) - hat aber nichts geändert.
Er greift auch immer noch auf 'Person' zu.
Warum?

Worauf wird eigentlich 'int' gemappt, in den Mappings hab ich das nicht
gefunden, oder muss man Integer nehmen?


Ich poste gerne noch andere Details, vielleicht kann man mir auf die
Sprünge helfen.

Gruß
Thomas

--
t.por...@t-online.de

Marek Lange

unread,
Jan 26, 2004, 4:32:50 AM1/26/04
to
Thomas Porocnik wrote:
> hab mich jetzt mal zu Testzwecken an EJBs rangemacht.
> wollte aber kein fertiges Sample deployen, sondern von Scratch und per
> Hand da durch.

Gut.

> Verwende Jboss3.2.3/JDK1.4/mySQL4.1.


> Ein (lokales) containermanaged EntityBean 'Person'; gehört zu einer
> Tabelle 'Person' mit Feldern smallint und varchar.
> Dann ein Sessionbean (Facade), von dem auf das EntityBean zugegriffen wird.
> Ein Standalone-Client.
> Aufgabe: Erzeugen einer 'Person' in der DB.
> Anscheined funktioniert bis zum Create im Person-Bean erst mal alles.
> Dort liefert der Trace dann ein ungültiges SQL-Statement:
> 'SELECT COUNT(*) FROM person WHERE'
> Anscheinend will der Manager nachsehen, ob es den Eintrag schon gibt,
> lässt aber die Klausel unvollständig.

Fehlermeldung? Stacktrace?

-marek

Thomas Porocnik

unread,
Jan 26, 2004, 5:14:26 AM1/26/04
to
Marek Lange schrieb:

> Fehlermeldung? Stacktrace?
>
2004-01-26 10:05:30,828 DEBUG
[org.jboss.ejb.plugins.cmp.jdbc.JDBCCreateEntityCommand.Person]
Executing SQL: SELECT COUNT(*) FROM person WHERE
2004-01-26 10:05:30,828 ERROR
[org.jboss.ejb.plugins.cmp.jdbc.JDBCCreateEntityCommand.Person] Error
checking if entity exists
java.sql.SQLException: Syntax error or access violation, message from
server: "You have an error in your SQL syntax. Check the manual that
corresponds to your MySQL server version for the right syntax to use
near '' at line 1"
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:1626)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:886)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:945)
at com.mysql.jdbc.Connection.execSQL(Connection.java:1844)
at etc...
--
t.por...@t-online.de

Marek Lange

unread,
Jan 26, 2004, 5:20:13 AM1/26/04
to
Thomas Porocnik wrote:

Kann es sein, dass mit dem PK der Tabelle etwas nicht i.O. ist? JBoss
kann denke ich damit nichts anfangen (weil das WHERE Statement leer
ist). Hast du einen Compound PK?

-marek

Michael Rauscher

unread,
Jan 26, 2004, 5:35:20 AM1/26/04
to
Hallo Thomas,

Thomas Porocnik schrieb:


> Hallo,
> hab mich jetzt mal zu Testzwecken an EJBs rangemacht.
> wollte aber kein fertiges Sample deployen, sondern von Scratch und per
> Hand da durch.

Lölblich, löblich :-)

>
> Verwende Jboss3.2.3/JDK1.4/mySQL4.1.
> Hab mich dann so durchgegoogelt..
>
> Aufbau meines Tests:
> Ein (lokales) containermanaged EntityBean 'Person'; gehört zu einer
> Tabelle 'Person' mit Feldern smallint und varchar.
> Dann ein Sessionbean (Facade), von dem auf das EntityBean zugegriffen wird.
> Ein Standalone-Client.
>
> Aufgabe: Erzeugen einer 'Person' in der DB.
>
> Anscheined funktioniert bis zum Create im Person-Bean erst mal alles.

Das ist ja schon mal was.

> Dort liefert der Trace dann ein ungültiges SQL-Statement:
> 'SELECT COUNT(*) FROM person WHERE'
> Anscheinend will der Manager nachsehen, ob es den Eintrag schon gibt,
> lässt aber die Klausel unvollständig.

Hier wäre etwas mehr Info gut: Exception, Code.

>
> Da die Tabelle in der DB schon vorher exisitierte, hab ich versucht im
> ejb-jar.xml den Schema-Namen auf 'Personen'
> zu ändern und nochmal zu deployen - die Tabelle müsste dann angelegt
> werden (?) - hat aber nichts geändert.

Ja. Die Tabelle muss angelegt werden oder es muss eine Meldung kommen,
dass Tabelle Personen schon existiert.

> Er greift auch immer noch auf 'Person' zu.
> Warum?

Ging das Deployen fehlerlos über die Bühne?

Probier mal folgendes:
1. Sicherstellen, dass in Deinem ear/jar alles richtig ist.
2. jBoss restarten
3. im Log das Deployen prüfen, dort muss eine Meldung kommen, dass
Tabelle Personen angelegt wurde oder bereits vorhanden ist.

Insbesondere auf Exceptions achten.

Ach ja, Du bist Dir aber sicher, dass Du auf die MySQL-DB und nicht auf
die Hypersonic zugreifst? Ist mir schon passiert...

>
> Worauf wird eigentlich 'int' gemappt, in den Mappings hab ich das nicht
> gefunden, oder muss man Integer nehmen?

AFAIK Integer. Wie willst Du NULL-Values auf int abbilden?

>
>
> Ich poste gerne noch andere Details, vielleicht kann man mir auf die
> Sprünge helfen.

Wäre hilfreich.

>
> Gruß
> Thomas
>

Gruß
Michael

Thomas Porocnik

unread,
Jan 26, 2004, 5:45:09 AM1/26/04
to
Marek Lange schrieb:

> Kann es sein, dass mit dem PK der Tabelle etwas nicht i.O. ist? JBoss
> kann denke ich damit nichts anfangen (weil das WHERE Statement leer
> ist). Hast du einen Compound PK?
>

Habe einfach eine Klasse wie folgt angelegt:
public class PersonPK implements Serializable {
public int _id;
public PersonPK() {
}
public PersonPK(int id) {
_id = id;
}
}

In der Tabelle ist die Spalte id ein smallint.

--
t.por...@t-online.de

Michael Rauscher

unread,
Jan 26, 2004, 6:02:29 AM1/26/04
to
Hallo Thomas,

Thomas Porocnik schrieb:

nimm Integer.

Gruß
Michael

Thomas Porocnik

unread,
Jan 26, 2004, 6:02:56 AM1/26/04
to
Michael Rauscher schrieb:


>
> Hier wäre etwas mehr Info gut: Exception, Code.

Siehe anderes Posting

>
> Ja. Die Tabelle muss angelegt werden oder es muss eine Meldung kommen,
> dass Tabelle Personen schon existiert.

Mein ejb-jar.xmal sieht auszugsweise so aus:
<entity>
<display-name>Person</display-name>
<ejb-name>Person</ejb-name>
<local-home>ejbtest.PersonHome</local-home>
<local>ejbtest.Person</local>
<ejb-class>ejbtest.PersonBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>ejbtest.PersonPK</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Personen</abstract-schema-name>
<cmp-field>
<field-name>id</field-name>
</cmp-field>
<cmp-field>
<field-name>name</field-name>
</cmp-field>
</entity>

Tabellenname hier Personen.
Beim Deployen scheint er aber alte Werte zu benutzen. Oh - mir fällt
gerade ein, das könnte ein Fehler von mir sein. Ic hbenutze wohl noch
das alte file, da nicht mher kompliliert zwischenzeitlich.

Andererseits kommt immer diese Meldung
Caused by: java.sql.SQLException: General error, message from server:
"Table 'test.jms_messages' doesn't exist"
Brauch ich die Tabelle jms_messages unbedingt?

Gruß
Thomas


--
t.por...@t-online.de

Marek Lange

unread,
Jan 26, 2004, 6:11:15 AM1/26/04
to
Thomas Porocnik wrote:
> Habe einfach eine Klasse wie folgt angelegt:
> public class PersonPK implements Serializable {

Du musst auch noch ein paar andere Methoden wie equals() oder hashcode()
implementieren. Für deinen einfachen Fall brauchst du aber keine
separate PK-Klasse (nur für zusammengesetzte PKs). Trag einfach den Typ
des PKs (java.lang.Integer) in den Descriptor als Primary Key ein.

-marek

Thomas Porocnik

unread,
Jan 26, 2004, 6:32:25 AM1/26/04
to
Michael Rauscher schrieb:
>
> nimm Integer.
>

Hallo Michael, hallo Marek.

Habe jetzt auf Integer umgestellt.
Ergebnis bleibt gleich.
Vor allem irritiert mich, dass er beim Deployen die Angabe
<abstract-schema-name>Personen</abstract-schema-name>
zu ignorieren scheint und immer noch die Tabelle Person verwenden will.

--
t.por...@t-online.de

Michael Rauscher

unread,
Jan 26, 2004, 6:54:06 AM1/26/04
to
Thomas Porocnik schrieb:

Setz mal <ejb-name>Personen</ejb-name>. AFAIK wird
<abstract-schema-name/> nur für queries verwendet - und müsste in
unterschiedlichen Beans gleich lauten dürfen.

Dann mal step by step:

1. Lösche dein ear/jar aus dem deploy-dir.
2. Lösche dein ear/jar aus dem build-dir
3. Erzeuge dein ear/jar.
4. Prüfe dein ear/jar, ob der/die richtige/n DD drin ist/sind.
5. Fahr jboss runter
6. Kopiere dein ear/jar ins deploy-dir
7. Fahr jboss hoch


Man übersieht dermaßen leicht etwas, dass es sich in solchen Fällen oft
rentiert, einfach von vorne anzufangen.

Gruß
Michael

Marek Lange

unread,
Jan 26, 2004, 7:10:38 AM1/26/04
to
Michael Rauscher wrote:

> Thomas Porocnik schrieb:
>
>> Michael Rauscher schrieb:
>>
>>>
>>> nimm Integer.
>>>
>>
>> Hallo Michael, hallo Marek.
>>
>> Habe jetzt auf Integer umgestellt.
>> Ergebnis bleibt gleich.
>> Vor allem irritiert mich, dass er beim Deployen die Angabe
>> <abstract-schema-name>Personen</abstract-schema-name>
>> zu ignorieren scheint und immer noch die Tabelle Person verwenden will.
> Setz mal <ejb-name>Personen</ejb-name>.

Der Name der DB-Tabelle steht in jbosscmp-jdbc.xml und nicht in der
ejb-jar.xml:

<entity>
<ejb-name>Person</ejb-name>
<table-name>Personen</table-name>

-marek

Michael Rauscher

unread,
Jan 26, 2004, 7:39:59 AM1/26/04
to
Hallo Marek,

Marek Lange schrieb:

Wenn es denn eine solche gibt.

Gruß
Michael

Thomas Porocnik

unread,
Jan 26, 2004, 7:42:42 AM1/26/04
to
Marek Lange schrieb:


> Der Name der DB-Tabelle steht in jbosscmp-jdbc.xml und nicht in der
> ejb-jar.xml:
>
> <entity>
> <ejb-name>Person</ejb-name>
> <table-name>Personen</table-name>
>

Ok. Jetzt regaiert er auch auf den gewechselten Namen.
Versucht allerding mit:
CREATE TABLE personen (id INTEGER, name VARCHAR(250) BINARY, CONSTRAINT
pk_personen PRIMARY KEY ())
die Tabelle anzulegen, was MysQl so aber nicht schluckt.
Habe dann auch diese Tabelle per Hand angelegt (Die PK-Definition so
geändert, dass es funktionert.

Dann sagt JBoss auch, dass die Tabelle existiert.

Warum kann JBoss anscheinend nicht die richtige SQL-Syntax?
In standardjabosscmp.xml steht auch MySQL richtig eingetragen:
<datasource>java:/DefaultDS</datasource>
<datasource-mapping>mySQL</datasource-mapping>


Aber dannach wieder Sense. Kein Create...

???
--
t.por...@t-online.de

Michael Rauscher

unread,
Jan 26, 2004, 8:40:19 AM1/26/04
to
Hallo Thomas,

Thomas Porocnik schrieb:

> Marek Lange schrieb:

hast Du das Primary Key Feld im DD auch als solches angegeben?

In ejb-jar.xml nach den cmp-field Definitionen:

<primkey-field>id</primkey-field>

Gruß
Michael

Thomas Porocnik

unread,
Jan 26, 2004, 8:55:03 AM1/26/04
to
Michael Rauscher schrieb:

> hast Du das Primary Key Feld im DD auch als solches angegeben?
>
> In ejb-jar.xml nach den cmp-field Definitionen:
>
> <primkey-field>id</primkey-field>
>

Das war's!

Jetzt funktionert's erst mal...

Vielen Dank.


--
t.por...@t-online.de

0 new messages