OVH Cloud OVH Cloud

problème EJB CMP

2 réponses
Avatar
Bernard Koninckx
Je suis débutant en programmation J2EE.
J'ai un petit soucis, avec le code qui suit. En fait, mon application
cliente lorsque je recherche les occurences correspondantes ne me retourne
rien. Je ne comprend pas pourquoi. Avez-vous des idées ou des suggestions a
me faire ?

Merci beaucoup à tous

Bernard

En fait voici le code :

package ejb.server.biblio;

/**
*
* @author Pat et Ben
*/
public abstract class BookBean implements javax.ejb.EntityBean {
private static final double idGenStart =
(double)System.currentTimeMillis();
private static double idGen = idGenStart;

public Double ejbCreate (String title) throws javax.ejb.CreateException
{
setId(new Double(idGen++));
setTitle(title);
return null;
}

public void ejbPostCreate(String tile) {}

public abstract Double getId();
public abstract void setId(Double id);
public abstract String getTitle();
public abstract void setTitle(String title);


public void ejbLoad() {}
public void ejbPassivate() {}
public void ejbRemove() {}
public void ejbStore() {}
public void setEntityContext(javax.ejb.EntityContext entityContext) {}
public void unsetEntityContext() {}
}

-----------------------------------------------------------


package ejb.server.biblio;

/**
*
* @author Pat et Ben
*/

// Address EJB's local interface
public interface BookRemote extends javax.ejb.EJBObject
{
public String getTitle() throws java.rmi.RemoteException;
public void setTitle(String title) throws java.rmi.RemoteException;

public Double getId() throws java.rmi.RemoteException;
}


------------------------------------------------------------------


package ejb.server.biblio;

import java.util.Collection;

/**
*
* @author Pat et Ben
*/
public interface BookHomeRemote extends javax.ejb.EJBHome {
public BookRemote create(String title)
throws javax.ejb.CreateException, java.rmi.RemoteException;

public BookRemote findByPrimaryKey(Double primaryKey)
throws javax.ejb.FinderException, java.rmi.RemoteException;

public Collection findByTitle(String title)
throws javax.ejb.FinderException, java.rmi.RemoteException;

}



-------------------------------------------------------------


Mon ejb-jar


<?xml version="1.0"?>

<!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>
<enterprise-beans>
<entity>
<ejb-name>Book</ejb-name>
<home>ejb.server.biblio.BookHomeRemote</home>
<remote>ejb.server.biblio.BookRemote</remote>
<ejb-class>ejb.server.biblio.BookBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.Double</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Book</abstract-schema-name>
<cmp-field><field-name>id</field-name></cmp-field>
<cmp-field><field-name>title</field-name></cmp-field>
<primkey-field>id</primkey-field>
<query>
<query-method>
<method-name>findByTitle</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<result-type-mapping>Remote</result-type-mapping>
<ejb-ql>
SELECT OBJECT(b) FROM Book AS b
WHERE b.title LIKE '%?1%'
</ejb-ql>
</query>
<security-identity><use-caller-identity/></security-identity>
</entity>
</enterprise-beans>
<assembly-descriptor>
<security-role>
<role-name>Users</role-name>
</security-role>
<method-permission>
<role-name>Users</role-name>
<method>
<ejb-name>Book</ejb-name>
<method-name>*</method-name>
</method>
</method-permission>
<container-transaction>
<method>
<ejb-name>Book</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>


---------------------------------------------------------------------

Et le code du client :

/*
* Biblio.java
*
* Created on 5 janvier 2004, 10:39
*/

package com.client.biblio;

import ejb.server.biblio.BookHomeRemote;
import ejb.server.biblio.BookRemote;

import javax.naming.Context;
import java.util.Properties;
import java.util.Collection;
import java.util.Iterator;

/**
*
* @author Pat et Ben
*/
public class TestBook {

/**
* @param args the command line arguments
*/
public static void main(String[] args) throws
javax.naming.NamingException {
// Obtenir l'objet Book
Context jndiContext = getInitialContext();
Object obj = jndiContext.lookup("BookHomeRemote");
BookHomeRemote home =
(BookHomeRemote)javax.rmi.PortableRemoteObject.narrow(obj,
BookHomeRemote.class);
try{
BookRemote book = home.create("Java In A Nutshell");
Double primaryKey = book.getId();
BookRemote bookSearch = home.findByPrimaryKey(primaryKey);
System.out.println("Id : " + bookSearch.getId().toString());
System.out.println("Titre : " + bookSearch.getTitle());
Collection bookSearch2 = home.findByTitle("%in%");
Iterator iterator = bookSearch2.iterator();
BookRemote bookEntry;
while(iterator.hasNext()){
bookEntry = (BookRemote)iterator.next();
System.out.println(" ID : " + bookEntry.getId().toString());
System.out.println(" Title : " + bookEntry.getTitle());
}
} catch (Exception excpt){
excpt.printStackTrace();
}
}

public static Context getInitialContext() throws
javax.naming.NamingException {
Properties p = new Properties();
return new javax.naming.InitialContext(p);
}
}


Si quelqu'un y trouve une erreur ou quelque chose de plus à faire , ce
serait sympa.

J'ai déjà plusieurs occurences dans ma base de données, mais mon client
n'affiche que la première occurence trouvée. Je ne comprends pas pourquoi !

Bernard Koninckx

2 réponses

Avatar
Vincent Brabant
Je suis débutant en programmation J2EE.
J'ai un petit soucis, avec le code qui suit. En fait, mon application
cliente lorsque je recherche les occurences correspondantes ne me retourne
rien. Je ne comprend pas pourquoi. Avez-vous des idées ou des suggestions a
me faire ?

Merci beaucoup à tous

Bernard

En fait voici le code :

package ejb.server.biblio;

/**
*
* @author Pat et Ben
*/
public abstract class BookBean implements javax.ejb.EntityBean {
private static final double idGenStart > (double)System.currentTimeMillis();
private static double idGen = idGenStart;

public Double ejbCreate (String title) throws javax.ejb.CreateException
{
setId(new Double(idGen++));
setTitle(title);
return null;
}

public void ejbPostCreate(String tile) {}

public abstract Double getId();
public abstract void setId(Double id);
public abstract String getTitle();
public abstract void setTitle(String title);


public void ejbLoad() {}
public void ejbPassivate() {}
public void ejbRemove() {}
public void ejbStore() {}
public void setEntityContext(javax.ejb.EntityContext entityContext) {}
public void unsetEntityContext() {}
}

-----------------------------------------------------------


package ejb.server.biblio;

/**
*
* @author Pat et Ben
*/

// Address EJB's local interface
public interface BookRemote extends javax.ejb.EJBObject
{
public String getTitle() throws java.rmi.RemoteException;
public void setTitle(String title) throws java.rmi.RemoteException;

public Double getId() throws java.rmi.RemoteException;
}


------------------------------------------------------------------


package ejb.server.biblio;

import java.util.Collection;

/**
*
* @author Pat et Ben
*/
public interface BookHomeRemote extends javax.ejb.EJBHome {
public BookRemote create(String title)
throws javax.ejb.CreateException, java.rmi.RemoteException;

public BookRemote findByPrimaryKey(Double primaryKey)
throws javax.ejb.FinderException, java.rmi.RemoteException;

public Collection findByTitle(String title)
throws javax.ejb.FinderException, java.rmi.RemoteException;

}



-------------------------------------------------------------


Mon ejb-jar


<?xml version="1.0"?>

<!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>
<enterprise-beans>
<entity>
<ejb-name>Book</ejb-name>
<home>ejb.server.biblio.BookHomeRemote</home>
<remote>ejb.server.biblio.BookRemote</remote>
<ejb-class>ejb.server.biblio.BookBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.Double</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Book</abstract-schema-name>
<cmp-field><field-name>id</field-name></cmp-field>
<cmp-field><field-name>title</field-name></cmp-field>
<primkey-field>id</primkey-field>
<query>
<query-method>
<method-name>findByTitle</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<result-type-mapping>Remote</result-type-mapping>
<ejb-ql>
SELECT OBJECT(b) FROM Book AS b
WHERE b.title LIKE '%?1%'
</ejb-ql>
</query>
<security-identity><use-caller-identity/></security-identity>
</entity>
</enterprise-beans>
<assembly-descriptor>
<security-role>
<role-name>Users</role-name>
</security-role>
<method-permission>
<role-name>Users</role-name>
<method>
<ejb-name>Book</ejb-name>
<method-name>*</method-name>
</method>
</method-permission>
<container-transaction>
<method>
<ejb-name>Book</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>


---------------------------------------------------------------------

Et le code du client :

/*
* Biblio.java
*
* Created on 5 janvier 2004, 10:39
*/

package com.client.biblio;

import ejb.server.biblio.BookHomeRemote;
import ejb.server.biblio.BookRemote;

import javax.naming.Context;
import java.util.Properties;
import java.util.Collection;
import java.util.Iterator;

/**
*
* @author Pat et Ben
*/
public class TestBook {

/**
* @param args the command line arguments
*/
public static void main(String[] args) throws
javax.naming.NamingException {
// Obtenir l'objet Book
Context jndiContext = getInitialContext();
Object obj = jndiContext.lookup("BookHomeRemote");
BookHomeRemote home > (BookHomeRemote)javax.rmi.PortableRemoteObject.narrow(obj,
BookHomeRemote.class);
try{
BookRemote book = home.create("Java In A Nutshell");
Double primaryKey = book.getId();
BookRemote bookSearch = home.findByPrimaryKey(primaryKey);
System.out.println("Id : " + bookSearch.getId().toString());
System.out.println("Titre : " + bookSearch.getTitle());
Collection bookSearch2 = home.findByTitle("%in%");
Iterator iterator = bookSearch2.iterator();
BookRemote bookEntry;
while(iterator.hasNext()){
bookEntry = (BookRemote)iterator.next();
System.out.println(" ID : " + bookEntry.getId().toString());
System.out.println(" Title : " + bookEntry.getTitle());
}
} catch (Exception excpt){
excpt.printStackTrace();
}
}

public static Context getInitialContext() throws
javax.naming.NamingException {
Properties p = new Properties();
return new javax.naming.InitialContext(p);
}
}


Si quelqu'un y trouve une erreur ou quelque chose de plus à faire , ce
serait sympa.

J'ai déjà plusieurs occurences dans ma base de données, mais mon client
n'affiche que la première occurence trouvée. Je ne comprends pas pourquoi !

Bernard Koninckx




Tout d'abord, je vois que tu as la query suivante

<ejb-ql>
SELECT OBJECT(b) FROM Book AS b
WHERE b.title LIKE '%?1%'
</ejb-ql>

Et lorsque tu appelles la méthode qui doit exécuter cette query, tu lui repasse les %%

Donc finalement, il fait comme query:
<ejb-ql>
SELECT OBJECT(b) FROM Book AS b
WHERE b.title LIKE '%%in%%'
</ejb-ql>

De plus, tu fais une requête sur %in%.
Je ne sais pas ce que tu as dans ta db, mais si tu t'attends à ce qu'il te retourne Java In a Nustshell, c'est raté car c'est In, avec I majuscule et non in en minuscule.

Donne un peu la liste des occurences que tu as déjà.

Bonne nuit
--
Vincent Brabant
----------------
http://www.netbeans.org/index_fr.html
http://vbrabant-fr.skynetblogs.be

Avatar
Bernard Koninckx
J'ai posté le message sur le news anglais comp.lang.java.beans, et on m'a
répondu a juste titre que la clause like EJB-QL doit être codée en dur ans
le fichier ejb-jar (b.title LIKE '%in%'), on ne peut pas le faire de manière
dynamique à partir du client.

Merci quand même pour la réponse que tu m'as apportée.

Bernard

"Vincent Brabant" a écrit dans le message de
news: 3ffb3861$0$6087$
Je suis débutant en programmation J2EE.
J'ai un petit soucis, avec le code qui suit. En fait, mon application
cliente lorsque je recherche les occurences correspondantes ne me
retourne


rien. Je ne comprend pas pourquoi. Avez-vous des idées ou des
suggestions a


me faire ?

Merci beaucoup à tous

Bernard

En fait voici le code :

package ejb.server.biblio;

/**
*
* @author Pat et Ben
*/
public abstract class BookBean implements javax.ejb.EntityBean {
private static final double idGenStart > > (double)System.currentTimeMillis();
private static double idGen = idGenStart;

public Double ejbCreate (String title) throws
javax.ejb.CreateException


{
setId(new Double(idGen++));
setTitle(title);
return null;
}

public void ejbPostCreate(String tile) {}

public abstract Double getId();
public abstract void setId(Double id);
public abstract String getTitle();
public abstract void setTitle(String title);


public void ejbLoad() {}
public void ejbPassivate() {}
public void ejbRemove() {}
public void ejbStore() {}
public void setEntityContext(javax.ejb.EntityContext entityContext)
{}


public void unsetEntityContext() {}
}

-----------------------------------------------------------


package ejb.server.biblio;

/**
*
* @author Pat et Ben
*/

// Address EJB's local interface
public interface BookRemote extends javax.ejb.EJBObject
{
public String getTitle() throws java.rmi.RemoteException;
public void setTitle(String title) throws java.rmi.RemoteException;

public Double getId() throws java.rmi.RemoteException;
}


------------------------------------------------------------------


package ejb.server.biblio;

import java.util.Collection;

/**
*
* @author Pat et Ben
*/
public interface BookHomeRemote extends javax.ejb.EJBHome {
public BookRemote create(String title)
throws javax.ejb.CreateException, java.rmi.RemoteException;

public BookRemote findByPrimaryKey(Double primaryKey)
throws javax.ejb.FinderException, java.rmi.RemoteException;

public Collection findByTitle(String title)
throws javax.ejb.FinderException, java.rmi.RemoteException;

}



-------------------------------------------------------------


Mon ejb-jar


<?xml version="1.0"?>

<!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>
<enterprise-beans>
<entity>
<ejb-name>Book</ejb-name>
<home>ejb.server.biblio.BookHomeRemote</home>
<remote>ejb.server.biblio.BookRemote</remote>
<ejb-class>ejb.server.biblio.BookBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>java.lang.Double</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Book</abstract-schema-name>
<cmp-field><field-name>id</field-name></cmp-field>
<cmp-field><field-name>title</field-name></cmp-field>
<primkey-field>id</primkey-field>
<query>
<query-method>
<method-name>findByTitle</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<result-type-mapping>Remote</result-type-mapping>
<ejb-ql>
SELECT OBJECT(b) FROM Book AS b
WHERE b.title LIKE '%?1%'
</ejb-ql>
</query>

<security-identity><use-caller-identity/></security-identity>


</entity>
</enterprise-beans>
<assembly-descriptor>
<security-role>
<role-name>Users</role-name>
</security-role>
<method-permission>
<role-name>Users</role-name>
<method>
<ejb-name>Book</ejb-name>
<method-name>*</method-name>
</method>
</method-permission>
<container-transaction>
<method>
<ejb-name>Book</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>


---------------------------------------------------------------------

Et le code du client :

/*
* Biblio.java
*
* Created on 5 janvier 2004, 10:39
*/

package com.client.biblio;

import ejb.server.biblio.BookHomeRemote;
import ejb.server.biblio.BookRemote;

import javax.naming.Context;
import java.util.Properties;
import java.util.Collection;
import java.util.Iterator;

/**
*
* @author Pat et Ben
*/
public class TestBook {

/**
* @param args the command line arguments
*/
public static void main(String[] args) throws
javax.naming.NamingException {
// Obtenir l'objet Book
Context jndiContext = getInitialContext();
Object obj = jndiContext.lookup("BookHomeRemote");
BookHomeRemote home > > (BookHomeRemote)javax.rmi.PortableRemoteObject.narrow(obj,
BookHomeRemote.class);
try{
BookRemote book = home.create("Java In A Nutshell");
Double primaryKey = book.getId();
BookRemote bookSearch = home.findByPrimaryKey(primaryKey);
System.out.println("Id : " + bookSearch.getId().toString());
System.out.println("Titre : " + bookSearch.getTitle());
Collection bookSearch2 = home.findByTitle("%in%");
Iterator iterator = bookSearch2.iterator();
BookRemote bookEntry;
while(iterator.hasNext()){
bookEntry = (BookRemote)iterator.next();
System.out.println(" ID : " +
bookEntry.getId().toString());


System.out.println(" Title : " + bookEntry.getTitle());
}
} catch (Exception excpt){
excpt.printStackTrace();
}
}

public static Context getInitialContext() throws
javax.naming.NamingException {
Properties p = new Properties();
return new javax.naming.InitialContext(p);
}
}


Si quelqu'un y trouve une erreur ou quelque chose de plus à faire , ce
serait sympa.

J'ai déjà plusieurs occurences dans ma base de données, mais mon client
n'affiche que la première occurence trouvée. Je ne comprends pas
pourquoi !



Bernard Koninckx




Tout d'abord, je vois que tu as la query suivante

<ejb-ql>
SELECT OBJECT(b) FROM Book AS b
WHERE b.title LIKE '%?1%'
</ejb-ql>

Et lorsque tu appelles la méthode qui doit exécuter cette query, tu lui
repasse les %%


Donc finalement, il fait comme query:
<ejb-ql>
SELECT OBJECT(b) FROM Book AS b
WHERE b.title LIKE '%%in%%'
</ejb-ql>

De plus, tu fais une requête sur %in%.
Je ne sais pas ce que tu as dans ta db, mais si tu t'attends à ce qu'il te
retourne Java In a Nustshell, c'est raté car c'est In, avec I majuscule et

non in en minuscule.

Donne un peu la liste des occurences que tu as déjà.

Bonne nuit
--
Vincent Brabant
----------------
http://www.netbeans.org/index_fr.html
http://vbrabant-fr.skynetblogs.be