|
Cadre Fonctionnel |
Développement d’un entity bean |
|
Cadre Technique |
NT / JonAS (Java Open Application Server) |
|
Identifiant |
ETB_EJB_01 |
|
Référent Technique |
|
|
Version |
1.0 |
|
Auteur |
Alexandre Brillant |
|
Date |
04/01 |
|
Source |
Documentation Jonas |
|
Dépendance |
|
|
Cible |
Un entity bean est associé à un ensemble de données. Son état persistant minimize les accès intempestifs et favorise un ensemble de pré-traitements. Deux catégories de support existent :
Le support par containeur (Container-Managed Persistence) : Dans ce cas, la relation entre le bean et la base de données est gérée automatiquement par le containeur à l’aide du descripteur XML.
Le support par l’utilisateur (Bean-Managed Persistence) : Le concepteur de l’entity bean gère lui-même les accès aux données. Par la méthode ejbCreate, le développeur être amené à concevoir les données associées à l’EJB dans la base de données.
Nous allons nous intéresser au support par l’utilisateur. Le principe est assez proche en terme de développement des session beans mais fait intervenir la notion de primary key. Cette primary key est unique et associée à un type de donnée, elle est construite à partir d’un ensemble de critères souvent utilisés pour construire des requêtes SQL. Le cycle de vie d’un entity bean passera par une phase d’activation suite à la demande d’un utilisateur
- Exemple d'interface pour le cycle de vie :
package hexadev;
import java.rmi.RemoteException;
import java.util.Enumeration;
import javax.ejb.*;
/**
* Interface d'accès
*/
public interface UserHome extends EJBHome {
/**
Création d'une donnée à l'aide de
userName
*/
public User create( String userName ) throws RemoteException,
CreateException;
/**
Création d'une donnée utilisant une clé
primaire
*/
public User findByPrimaryKey( UserBeanPK pk) throws
RemoteException, FinderException;
}
|
- Exemple des opérations disponibles sur l’entité :
package hexadev;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
/**
* Interface pour le client d'accès aux données
*/
public interface User extends EJBObject {
public String getName() throws RemoteException;
}
|
Exemple de clé primaire.
Remarque : La méthode hashcode sert à identifier l’entity bean de manière unique dans une collection. Elle permet déviter par exemple d’avoir autant de bean qu’il y a de client. La méthode equal lui est complémentaire car elle permet de valider l’équivallence de deux beans.
package hexadev;
/**
* Clé primaire associée à un entity bean
*/
public class UserBeanPK implements java.io.Serializable {
public String userName;
public UserBeanPK( String userName ) {
this.userName = userName;
public UserBeanPK() {
}
/**
* Identifiant unique */
public int hashCode() {
return userName.hashCode();
}
/**
* Vérifier l'égalité de deux objets
*/
public boolean equals( Object other ) {
return userName.equals( other.toString() );
}
}
|
- Exemple d'implémentation de l’entité :
package hexadev;
import java.rmi.RemoteException;
import javax.ejb.*;
/**
* Implémentation d'un entity bean
*/
public class UserBean implements EntityBean {
protected EntityContext entityContext;
private String userName;
public UserBeanPK ejbCreate( String userName )
throws CreateException {
return new UserBeanPK( userName );
}
/**
* Appelée avant l'appel à la méthode
ejbCreate
*/
public void ejbPostCreate( String userName ) {
this.userName = userName;
}
/**
* Appelée lorsque le bean est rendu disponible pour un
client
*/
public void ejbActivate() {
}
/**
* Demande au bean de se synchroniser avec la base de données
*/
public void ejbLoad() { }
/**
* Appelé lorsque le bean n'est plus utilisé par un
client
*/
public void ejbPassivate() { }
/**
* Appelé lorsque le bean est détruit
*/
public void ejbRemove() throws RemoveException { }
/**
* Appelé pour demander au bean de stocker son état
* dans la base de données
*/
public void ejbStore() {
}
public UserBeanPK ejbFindByPrimaryKey( UserBeanPK pk ) {
return pk;
}
/**
* Stocker le contexte du bean
*/
public void setEntityContext(EntityContext ctx) {
entityContext = ctx;
}
public void unsetEntityContext() {
entityContext = null;
}
/**
* @return Le nom de l'utilisateur
*/
public String getName() {
return userName;
}
}
|
- Exemple de client :
package hexadev;
import java.io.*;
import java.rmi.RemoteException;
import java.util.*;
import javax.ejb.*;
import javax.transaction.UserTransaction;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
/**
* Client de test
*/
public class ClientUser {
public static void main(String[] args) {
Context initialContext = null;
try {
initialContext = new InitialContext();
} catch (Exception e) {
e.printStackTrace();
System.exit( 1 );
}
UserHome home = null;
try {
home = (UserHome)PortableRemoteObject.narrow(
initialContext.lookup("user"),
UserHome.class);
User user1 = home.findByPrimaryKey( new UserBeanPK( "hexadev"
) );
System.out.println( "Utilisateur :" + user1.getName()
);
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
- Exemple de descripteurs ejb-jar.xml et jonas-ejb-jar.xml :
ejb-jar.xml :
<!DOCTYPE ejb-jar SYSTEM "../../../../xml/ejb-jar_1_1.dtd">
<ejb-jar>
<enterprise-beans>
<entity>
<description>User EntityBean</description>
<ejb-name>User</ejb-name>
<home>hexadev.UserHome</home>
<remote>hexadev.User</remote>
<ejb-class>hexadev.UserBean</ejb-class>
<persistence-type>Bean</persistence-type>
<prim-key-class>hexadev.UserBeanPK</prim-key-class>
<reentrant>False</reentrant>
</entity>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>User</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
|
jonas-ejb-jar.xml :
<!DOCTYPE jonas-ejb-jar SYSTEM "../../../../xml/jonas-ejb-jar.dtd">
<jonas-ejb-jar>
<jonas-entity>
<ejb-name>User</ejb-name>
<jndi-name>UserHome</jndi-name>
</jonas-entity>
</jonas-ejb-jar>
- Compilation :
Le plus simple est de disposer d’un script de compilation contenant :
call %JONAS_ROOT%\bin\nt\config_env.bat
javac -d classes User.java UserHome.java UserBeanPK.java
UserBean.java ClientUser.java
call %JONAS_ROOT%\bin\nt\GenIC.bat
La première ligne initialise la variable d’environnement CLASSPATH. La deuxième ligne réalise la compilation de l’entity bean et dépose les classes dans le répertoire courant classes. Enfin, la dernière ligne construit le squelette et l’amorce permettant au client de communiquer avec le serveur.
- Test :
Il faut maintenant indiquer la présence de l’EJB à JOnAS. Cela peut se faire à partir du fichier jonas.properties. Ce dernier se trouve dans le répertoire d’installation de JonAS et dans le
répertoire courant de l’exemple.
Exemple :
jonas.beans.descriptors ejb-jar.xml
JonAS doit aussi trouver les classes de l’utilisateur. Cela peut se faire simplement en modifiant le fichier config_env.bat ou en changeant la variable d’environnement XTRA_CLASSPATH.
Exemple :
Set XTRA_CLASSPATH="classes