Fiches / Articles

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 

INS_EJB_01

Cible 

BD_EJB_01, OPT_ETB_EJB_01

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 :

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;

}

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