EJB: Entity Beans com Container-Managed Persistence

Um Pouco de Teoria para Entender o Exemplo

Lembrando o que é um Entity Bean

Persistência

Acesso Compartilhado

Chave Primária

Relacionamentos

Sobre Container-Managed Persistence

Esquema Abstrato

wpe3.jpg (13842 bytes)

Campos Persistentes

Campos de Relacionamentos

Multiplicidade em Relacionamentos Container-Managed

Direção/Navegabilidade em Relacionamentos Container-Managed

O Ciclo de Vida de um Entity Bean

Ciclo-Entity-Beans.gif (12489 bytes)

Resumo da Applicação RosterApp

wpe2.jpg (12083 bytes)

O Código do Entity Bean PlayerEJB

A Interface Local

package team;

import java.util.*;
import javax.ejb.*;

public interface LocalPlayer extends EJBLocalObject {
  public String getPlayerId();
  public String getName();
  public String getPosition();
  public double getSalary();
  public Collection getTeams();
  public Collection getLeagues() throws FinderException;
  public Collection getSports() throws FinderException;
}

A Interface Home Local

package team;

import java.util.*;
import javax.ejb.*;

public interface LocalPlayerHome extends EJBLocalHome {
    
  public LocalPlayer create (String id, String name, String position,
                             double salary)
                     throws CreateException;
  
  public LocalPlayer findByPrimaryKey (String id)
                     throws FinderException;
  
  public Collection findByPosition(String position) 
                    throws FinderException;

  public Collection findByHigherSalary(String name) 
                    throws FinderException;

  public Collection findBySalaryRange(double low, double high) 
                    throws FinderException;

  public Collection findByLeague(LocalLeague league) 
                    throws FinderException;

  public Collection findBySport(String sport) 
                    throws FinderException;

  public Collection findByCity(String city) 
                    throws FinderException;

  public Collection findAll() 
                    throws FinderException;

  public Collection findNotOnTeam() 
                    throws FinderException;

  public Collection findByPositionAndName(String position, 
                    String name)
                    throws FinderException;

  public Collection findByTest (String parm1, String parm2, String parm3)
                    throws FinderException;

}

A Classe de Implementação

package team;

import java.util.*;
import javax.ejb.*;
import javax.naming.*;
import util.Debug;

public abstract class PlayerBean implements EntityBean {

  private EntityContext context;

  // Access methods for persistent fields

  public abstract String getPlayerId();
  public abstract void setPlayerId(String id);
  
  public abstract String getName();
  public abstract void setName(String name);

  public abstract String getPosition();
  public abstract void setPosition(String position);

  public abstract double getSalary();
  public abstract void setSalary(double salary);

  // Access methods for relationship fields

  public abstract Collection getTeams();
  public abstract void setTeams(Collection teams);

  // Select methods

  public abstract Collection ejbSelectLeagues(LocalPlayer player)
                  throws FinderException;

  public abstract Collection ejbSelectSports(LocalPlayer player)
                  throws FinderException;

  // Business methods

  public Collection getLeagues() throws FinderException {

    LocalPlayer player = 
        (team.LocalPlayer)context.getEJBLocalObject();
    return ejbSelectLeagues(player);
  }

  public Collection getSports() throws FinderException {

    LocalPlayer player = 
        (team.LocalPlayer)context.getEJBLocalObject();
    return ejbSelectSports(player);
  }

  // EntityBean  methods

  public String ejbCreate (String id, String name, String position,
    double salary) throws CreateException {

    Debug.print("PlayerBean ejbCreate");
    setPlayerId(id);
    setName(name);
    setPosition(position);
    setSalary(salary);
    return id;
  }
       
  public void ejbPostCreate (String id, String name, String position,
    double salary) throws CreateException { }

  public void setEntityContext(EntityContext ctx) {
    context = ctx;
  }
  
  public void unsetEntityContext() {
    context = null;
  }
  
  public void ejbRemove() {
    Debug.print("PlayerBean ejbRemove");
  }
  
  public void ejbLoad() {
    Debug.print("PlayerBean ejbLoad");
  }
  
  public void ejbStore() {
    Debug.print("PlayerBean ejbStore");
  }
  
  public void ejbPassivate() { }
  
  public void ejbActivate() { }

} // PlayerBean class

Métodos de acesso

public abstract class PlayerBean implements EntityBean {

  // ...

  // Access methods for persistent fields

  public abstract String getPlayerId();
  public abstract void setPlayerId(String id);
  
  public abstract String getName();
  public abstract void setName(String name);

  public abstract String getPosition();
  public abstract void setPosition(String position);

  public abstract double getSalary();
  public abstract void setSalary(double salary);
  // ...
}
  // Access methods for relationship fields

  public abstract Collection getTeams();
  public abstract void setTeams(Collection teams);

Métodos de Seleção

  // Select methods

  public abstract Collection ejbSelectLeagues(LocalPlayer player)
                  throws FinderException;

  public abstract Collection ejbSelectSports(LocalPlayer player)
                  throws FinderException;

Business Methods

  // Business methods

  public Collection getLeagues() throws FinderException {

    LocalPlayer player = 
        (team.LocalPlayer)context.getEJBLocalObject();
    return ejbSelectLeagues(player);
  }

  public Collection getSports() throws FinderException {

    LocalPlayer player = 
        (team.LocalPlayer)context.getEJBLocalObject();
    return ejbSelectSports(player);
  }

Callback methods

  public String ejbCreate (String id, String name, String position,
    double salary) throws CreateException {

    Debug.print("PlayerBean ejbCreate");
    setPlayerId(id);
    setName(name);
    setPosition(position);
    setSalary(salary);
    return id;
  }

Os Deployment Descriptors para RosterApp

RosterApp

Orelha General:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN' 'http://java.sun.com/dtd/application_1_3.dtd'>

<application>
  <display-name>RosterApp</display-name>
  <description>Application description</description>
  <module>
    <ejb>roster-ejb.jar</ejb>
  </module>
  <module>
    <java>roster-ac.jar</java>
  </module>
  <module>
    <ejb>team-ejb.jar</ejb>
  </module>
</application>

Orelha JNDI Names:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE j2ee-ri-specific-information PUBLIC '-//Sun Microsystems Inc.//DTD J2EE Reference Implementation 1.3//EN' 'http://localhost:8000/sun-j2ee-ri_1_3.dtd'>
<j2ee-ri-specific-information>
...
  <enterprise-beans>
    <module-name>team-ejb.jar</module-name>
    <unique-id>0</unique-id>
    <ejb>
      <ejb-name>LeagueEJB</ejb-name>
      <jndi-name>MyLeague</jndi-name>
...
    </ejb>
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE j2ee-ri-specific-information PUBLIC '-//Sun Microsystems Inc.//DTD J2EE Reference Implementation 1.3//EN' 'http://localhost:8000/sun-j2ee-ri_1_3.dtd'>

<j2ee-ri-specific-information>
  <app-client>
    <ejb-ref>
      <ejb-ref-name>ejb/SimpleRoster</ejb-ref-name>
      <jndi-name>MyRoster</jndi-name>
    </ejb-ref>
  </app-client>
</j2ee-ri-specific-information>
<j2ee-ri-specific-information>
...
  <enterprise-beans>
    <module-name>team-ejb.jar</module-name>
    <unique-id>0</unique-id>
    <ejb>
      <ejb-name>LeagueEJB</ejb-name>
...
    </ejb>
    <ejb>
      <ejb-name>TeamEJB</ejb-name>
...
    </ejb>
    <ejb>
      <ejb-name>PlayerEJB</ejb-name>
...
    </ejb>
...
    <cmpresource>
      <ds-jndi-name>jdbc/Cloudscape</ds-jndi-name>
      <default-resource-principal>
        <name></name>
        <password></password>
      </default-resource-principal>
    </cmpresource>
  </enterprise-beans>
</j2ee-ri-specific-information>

RosterClient

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE application-client PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application Client 1.3//EN' 'http://java.sun.com/dtd/application-client_1_3.dtd'>

<application-client>
  <display-name>RosterClient</display-name>
  <ejb-ref>
    <ejb-ref-name>ejb/SimpleRoster</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <home>roster.RosterHome</home>
    <remote>roster.Roster</remote>
  </ejb-ref>
</application-client>

RosterJAR

<?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>
  <display-name>RosterJAR</display-name>
  <enterprise-beans>
    <session>
      <display-name>RosterEJB</display-name>
      <ejb-name>RosterEJB</ejb-name>
      <home>roster.RosterHome</home>
      <remote>roster.Roster</remote>
      <ejb-class>roster.RosterBean</ejb-class>
      <session-type>Stateful</session-type>
      <transaction-type>Container</transaction-type>
      <ejb-local-ref>
        <ejb-ref-name>ejb/SimpleLeague</ejb-ref-name>
        <ejb-ref-type>Entity</ejb-ref-type>
        <local-home>team.LocalLeagueHome</local-home>
        <local>team.LocalLeague</local>
        <ejb-link>LeagueEJB</ejb-link>
      </ejb-local-ref>
      <ejb-local-ref>
        <ejb-ref-name>ejb/SimpleTeam</ejb-ref-name>
        <ejb-ref-type>Entity</ejb-ref-type>
        <local-home>team.LocalTeamHome</local-home>
        <local>team.LocalTeam</local>
        <ejb-link>TeamEJB</ejb-link>
      </ejb-local-ref>
      <ejb-local-ref>
        <ejb-ref-name>ejb/SimplePlayer</ejb-ref-name>
        <ejb-ref-type>Entity</ejb-ref-type>
        <local-home>team.LocalPlayerHome</local-home>
        <local>team.LocalPlayer</local>
        <ejb-link>PlayerEJB</ejb-link>
      </ejb-local-ref>
      <security-identity>
        <description></description>
        <use-caller-identity></use-caller-identity>
      </security-identity>
    </session>
  </enterprise-beans>
</ejb-jar>

TeamJAR

wpe1.jpg (24896 bytes)

<?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>
  <display-name>TeamJAR</display-name>
  <enterprise-beans>
    <entity>
      <display-name>LeagueEJB</display-name>
      <ejb-name>LeagueEJB</ejb-name>
      <local-home>team.LocalLeagueHome</local-home>
      <local>team.LocalLeague</local>
      <ejb-class>team.LeagueBean</ejb-class>
      <persistence-type>Container</persistence-type>
      <prim-key-class>java.lang.String</prim-key-class>
      <reentrant>False</reentrant>
      <cmp-version>2.x</cmp-version>
      <abstract-schema-name>League</abstract-schema-name>
      <cmp-field>
        <description>no description</description>
        <field-name>leagueId</field-name>
      </cmp-field>
      <cmp-field>
        <description>no description</description>
        <field-name>name</field-name>
      </cmp-field>
      <cmp-field>
        <description>no description</description>
        <field-name>sport</field-name>
      </cmp-field>
      <primkey-field>leagueId</primkey-field>
      <security-identity>
        <description></description>
        <use-caller-identity></use-caller-identity>
      </security-identity>
    </entity>
    <entity>
      <display-name>TeamEJB</display-name>
      <ejb-name>TeamEJB</ejb-name>
...
    </entity>
    <entity>
      <display-name>PlayerEJB</display-name>
      <ejb-name>PlayerEJB</ejb-name>
      <local-home>team.LocalPlayerHome</local-home>
      <local>team.LocalPlayer</local>
      <ejb-class>team.PlayerBean</ejb-class>
      <persistence-type>Container</persistence-type>
      <prim-key-class>java.lang.String</prim-key-class>
      <reentrant>False</reentrant>
      <cmp-version>2.x</cmp-version>
      <abstract-schema-name>Player</abstract-schema-name>
      <query>
        <description></description>
        <query-method>
          <method-name>findNotOnTeam</method-name>
          <method-params />
        </query-method>
        <ejb-ql>select object(p) from Player p 
where p.teams is empty</ejb-ql>
      </query>
...
    </entity>
  </enterprise-beans>
  <relationships>
    <ejb-relation>
      <description>Team To Player</description>
      <ejb-relation-name></ejb-relation-name>
      <ejb-relationship-role>
        <ejb-relationship-role-name>TeamEJB</ejb-relationship-role-name>
        <multiplicity>many</multiplicity>
        <relationship-role-source>
          <ejb-name>TeamEJB</ejb-name>
        </relationship-role-source>
        <cmr-field>
          <cmr-field-name>players</cmr-field-name>
          <cmr-field-type>java.util.Collection</cmr-field-type>
        </cmr-field>
      </ejb-relationship-role>
      <ejb-relationship-role>
        <ejb-relationship-role-name>PlayerEJB</ejb-relationship-role-name>
        <multiplicity>many</multiplicity>
        <relationship-role-source>
          <ejb-name>PlayerEJB</ejb-name>
        </relationship-role-source>
        <cmr-field>
          <cmr-field-name>teams</cmr-field-name>
          <cmr-field-type>java.util.Collection</cmr-field-type>
        </cmr-field>
      </ejb-relationship-role>
    </ejb-relation>
    <ejb-relation>
      <description>League-Team</description>
      <ejb-relation-name></ejb-relation-name>
      <ejb-relationship-role>
        <ejb-relationship-role-name>LeagueEJB</ejb-relationship-role-name>
        <multiplicity>one</multiplicity>
        <relationship-role-source>
          <ejb-name>LeagueEJB</ejb-name>
        </relationship-role-source>
        <cmr-field>
          <cmr-field-name>teams</cmr-field-name>
          <cmr-field-type>java.util.Collection</cmr-field-type>
        </cmr-field>
      </ejb-relationship-role>
      <ejb-relationship-role>
        <ejb-relationship-role-name>TeamEJB</ejb-relationship-role-name>
        <multiplicity>many</multiplicity>
        <cascade-delete />
        <relationship-role-source>
          <ejb-name>TeamEJB</ejb-name>
        </relationship-role-source>
        <cmr-field>
          <cmr-field-name>league</cmr-field-name>
        </cmr-field>
      </ejb-relationship-role>
    </ejb-relation>
  </relationships>
...
 </ejb-jar>

wpe5.jpg (37117 bytes)

wpe6.jpg (33015 bytes)

wpe8.jpg (13624 bytes)

Chamadas de Métodos em RosterApp

Criação de um Jogador

RosterClient

      Context initial = new InitialContext();
      Object objref = initial.lookup("java:comp/env/ejb/SimpleRoster");

      RosterHome home = 
          (RosterHome)PortableRemoteObject.narrow(objref, 
                                       RosterHome.class);
      Roster myRoster = home.create();
      // ...
      myRoster.createPlayer(
                 new PlayerDetails(
                   "P1", "Phil Jones", "goalkeeper", 100.00));

RosterEJB

  public void createPlayer(PlayerDetails details) { 

    Debug.print("RosterBean createPlayer");
    try {
      LocalPlayer player = playerHome.create(details.getId(), 
          details.getName(), details.getPosition(), details.getSalary());
    } catch (Exception ex) {
      throw new EJBException(ex.getMessage());
    }
  }
  public void ejbCreate() throws CreateException {

    Debug.print("RosterBean ejbCreate");
    try {
      playerHome = lookupPlayer();
      teamHome = lookupTeam();
      leagueHome = lookupLeague();
    } catch (NamingException ex) {
      throw new CreateException(ex.getMessage());
    }
  }

  private LocalPlayerHome lookupPlayer() throws NamingException {
     
    Context initial = new InitialContext();
    Object objref = initial.lookup("java:comp/env/ejb/SimplePlayer");
    return (LocalPlayerHome) objref;
  }

PlayerEJB

  public String ejbCreate (String id, String name, String position,
    double salary) throws CreateException {

    Debug.print("PlayerBean ejbCreate");
    setPlayerId(id);
    setName(name);
    setPosition(position);
    setSalary(salary);
    return id;
  }

Adição de um Jogador a um Time

RosterClient

      myRoster.addPlayer("P1", "T1");

RosterEJB

  public void addPlayer(String playerId, String teamId) { 

    Debug.print("RosterBean addPlayer");
    try {
      LocalTeam team = teamHome.findByPrimaryKey(teamId);
      LocalPlayer player = playerHome.findByPrimaryKey(playerId);
      team.addPlayer(player);
    } catch (Exception ex) {
      throw new EJBException(ex.getMessage());
    }
  }

TeamEJB

  public abstract Collection getPlayers();
  public abstract void setPlayers(Collection players);
  public void addPlayer(LocalPlayer player) {

    Debug.print("TeamBean addPlayer");
    try {
      Collection players = getPlayers();
      players.add(player);
    } catch (Exception ex) {
      throw new EJBException(ex.getMessage());
    }
  }

Remoção de um Jogador

RosterClient

  myRoster.removePlayer(“P4”);

RosterEJB

  public void removePlayer(String playerId) { 

    Debug.print("RosterBean removePlayer");
    try {
      LocalPlayer player = playerHome.findByPrimaryKey(playerId);
      player.remove();
    } catch (Exception ex) {
      throw new EJBException(ex.getMessage());
    }
  }

Remoção de um Jogador de um Time

RosterClient

  myRoster.dropPlayer(“P2”, “T1”);

RosterEJB

  public void dropPlayer(String playerId, String teamId) {

    Debug.print("RosterBean dropPlayer");
    try {
        LocalPlayer player = playerHome.findByPrimaryKey(playerId);
        LocalTeam team = teamHome.findByPrimaryKey(teamId);
        team.dropPlayer(player);
    } catch (Exception ex) {
        throw new EJBException(ex.getMessage());
    }
  }

TeamEJB

  public void dropPlayer(LocalPlayer player) {

    Debug.print("TeamBean dropPlayer");
    try {
      Collection players = getPlayers();
      players.remove(player);
    } catch (Exception ex) {
      throw new EJBException(ex.getMessage());
    }
  }

Obtenção dos Jogadores de um Time

RosterClient

      playerList = myRoster.getPlayersOfTeam("T2");

RosterEJB

  public ArrayList getPlayersOfTeam(String teamId) { 

    Debug.print("RosterBean getPlayersOfTeam");
    Collection players = null;

    try {
      LocalTeam team = teamHome.findByPrimaryKey(teamId);
      players = team.getPlayers();
    } catch (Exception ex) {
      throw new EJBException(ex.getMessage());
    }

    return copyPlayersToDetails(players);
  } // getPlayersOfTeam

  private ArrayList copyPlayersToDetails(Collection players) {

    ArrayList detailsList = new ArrayList();
    Iterator i = players.iterator();

    while (i.hasNext()) {
      LocalPlayer player = (LocalPlayer) i.next();
      PlayerDetails details = new PlayerDetails(player.getPlayerId(),
          player.getName(), player.getPosition(), player.getSalary());
      detailsList.add(details);
    }

    return detailsList;
  } // copyPlayersToDetails

TeamEJB

  public abstract Collection getPlayers();
  public Collection getPlayers();
  LocalTeam team = teamHome.findByPrimaryKey(teamId);
  Collection players = team.getPlayers();
  players.remove(player);

Obtenção de uma Cópia dos Jogadores de um Time

RosterClient

  playerList = myRoster.getPlayersOfTeamCopy("T5");

RosterEJB

  public ArrayList getPlayersOfTeamCopy(String teamId) { 

    Debug.print("RosterBean getPlayersOfTeamCopy");
    ArrayList playersList = null;

    try {
      LocalTeam team = teamHome.findByPrimaryKey(teamId);
      playersList = team.getCopyOfPlayers();
    } catch (Exception ex) {
      throw new EJBException(ex.getMessage());
    }

    return playersList;

  } // getPlayersOfTeamCopy

TeamEJB

  public ArrayList getCopyOfPlayers() {

    Debug.print("TeamBean getCopyOfPlayers");
    ArrayList playerList = new ArrayList();
    Collection players = getPlayers();

    Iterator i = players.iterator();
    while (i.hasNext()) {
      LocalPlayer player = (LocalPlayer) i.next();
      PlayerDetails details = new PlayerDetails(player.getPlayerId(),
                              player.getName(), player.getPosition(), 0.00);
      playerList.add(details);
    }

    return playerList;
  }

Localização de Jogadores por Posição

RosterClient

  playerList = myRoster.getPlayersByPosition("defender");

RosterEJB

  public ArrayList getPlayersByPosition(String position) {

    Debug.print("RosterBean getPlayersByPosition");
    Collection players = null;

    try {
      players = playerHome.findByPosition(position);
    } catch (Exception ex) {
      throw new EJBException(ex.getMessage());
    }

    return copyPlayersToDetails(players);
  } // getPlayersByPosition

PlayerEJB

  public Collection findByPosition(String position) 
                    throws FinderException;
  SELECT DISTINCT OBJECT(p) FROM Player p WHERE p.position = ?1

Obtenção dos Esportes de um Jogador

RosterClient

  sportList = myRoster.getSportsOfPlayer("P28");

RosterEJB

  public ArrayList getSportsOfPlayer(String playerId) { 

    Debug.print("RosterBean getSportsOfPlayer");
    ArrayList sportsList = new ArrayList();
    Collection sports = null;

    try {
      LocalPlayer player = playerHome.findByPrimaryKey(playerId);
      sports = player.getSports();
    } catch (Exception ex) {
      throw new EJBException(ex.getMessage());
    }
  
    Iterator i = sports.iterator();
    while (i.hasNext()) {
      String sport = (String) i.next();
      sportsList.add(sport);
    }
    return sportsList;
  } // getSportsOfPlayer

PlayerEJB

  public Collection getSports() throws FinderException {

    LocalPlayer player = 
        (team.LocalPlayer)context.getEJBLocalObject();
    return ejbSelectSports(player);
  }
  public abstract Collection ejbSelectSports(LocalPlayer player)
                  throws FinderException;
  SELECT DISTINCT t.league.sport FROM Player p, IN (p.teams) AS t WHERE p = ?1

Compilação, Deployment e Execução de RosterApp

Compilação

Deployment

Execução do Cliente

C:\..\src\cmproster\earpronto>runclient -client RosterApp.ear -name RosterClient -textauth
Initiating login ...
Username = null
Enter Username:guest
Enter Password:guest123
Binding name:`java:comp/env/ejb/SimpleRoster`
P6 Ian Carlyle goalkeeper 555.0
P7 Rebecca Struthers midfielder 777.0
P10 Terry Smithson midfielder 100.0
P8 Anne Anderson forward 65.0
P9 Jan Wesley defender 100.0

T5 Crows Orland
T2 Gophers Manteca
T1 Honey Bees Visalia

P2 Alice Smith defender 505.0
P5 Barney Bold defender 100.0
P9 Jan Wesley defender 100.0
P22 Janice Walker defender 857.0
P25 Frank Fletcher defender 399.0

L2 Valley Basketball
L1 Mountain Soccer

Unbinding name:`java:comp/env/ejb/SimpleRoster`
/*
 *
 * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * This software is the proprietary information of Sun Microsystems, Inc.  
 * Use is subject to license terms.
 * 
 */

package client;

import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import util.*;
import roster.*;

public class RosterClient {

  public static void main(String[] args) {
    try {
      Context initial = new InitialContext();
      Object objref = initial.lookup("java:comp/env/ejb/SimpleRoster");

      RosterHome home = 
          (RosterHome)PortableRemoteObject.narrow(objref, 
                                       RosterHome.class);

      Roster myRoster = home.create();

      insertInfo(myRoster);
      getSomeInfo(myRoster);

      // getMoreInfo(myRoster);

      System.exit(0);

    } catch (Exception ex) {
      System.err.println("Caught an exception:");
      ex.printStackTrace();
    }
  } // main


  private static void getSomeInfo(Roster myRoster) {

    try {

      ArrayList playerList;
      ArrayList teamList;
      ArrayList leagueList;

      playerList = myRoster.getPlayersOfTeam("T2");
      printDetailsList(playerList);

      teamList = myRoster.getTeamsOfLeague("L1");
      printDetailsList(teamList);

      playerList = myRoster.getPlayersByPosition("defender");
      printDetailsList(playerList);


      leagueList = myRoster.getLeaguesOfPlayer("P28");
      printDetailsList(leagueList);

    } catch (Exception ex) {
      System.err.println("Caught an exception:");
      ex.printStackTrace();
    }

  } // getSomeInfo

  private static void getMoreInfo(Roster myRoster) {

    try {

      LeagueDetails leagueDetails;
      TeamDetails teamDetails;
      PlayerDetails playerDetails;
      ArrayList playerList;
      ArrayList teamList;
      ArrayList leagueList;
      ArrayList sportList;

      leagueDetails = myRoster.getLeague("L1");
      System.out.println(leagueDetails.toString());
      System.out.println();

      teamDetails = myRoster.getTeam("T3");
      System.out.println(teamDetails.toString());
      System.out.println();

      playerDetails = myRoster.getPlayer("P20");
      System.out.println(playerDetails.toString());
      System.out.println();

      playerList = myRoster.getPlayersOfTeam("T2");
      printDetailsList(playerList);

      teamList = myRoster.getTeamsOfLeague("L1");
      printDetailsList(teamList);

      playerList = myRoster.getPlayersByPosition("defender");
      playerList = myRoster.getAllPlayers();
      playerList = myRoster.getPlayersNotOnTeam();
      playerList = myRoster.getPlayersByPositionAndName("power forward", 
          "Jack Patterson");
      playerList = myRoster.getPlayersByCity("Truckee");
      playerList = myRoster.getPlayersBySport("Soccer");
      playerList = myRoster.getPlayersByLeagueId("L1");
      playerList = myRoster.getPlayersByHigherSalary("Ian Carlyle");
      playerList = myRoster.getPlayersBySalaryRange(500.00, 800.00);
      playerList = myRoster.getPlayersOfTeamCopy("T5");

      leagueList = myRoster.getLeaguesOfPlayer("P28");
      printDetailsList(leagueList);

      sportList = myRoster.getSportsOfPlayer("P28");
      printDetailsList(sportList);

    } catch (Exception ex) {
      System.err.println("Caught an exception:");
      ex.printStackTrace();
    }

  } // getMoreInfo

  private static void printDetailsList(ArrayList list) {

    Iterator i = list.iterator();
    while (i.hasNext()) {
      Object details = (Object)i.next();
      System.out.println(details.toString());
    }
    System.out.println();
  } // printDetailsList


  private static void insertInfo(Roster myRoster) {

    try {
      // Leagues

      myRoster.createLeague(new LeagueDetails(
         "L1", "Mountain", "Soccer"));

      myRoster.createLeague(new LeagueDetails(
         "L2", "Valley", "Basketball"));

      // Teams

      myRoster.createTeamInLeague(new TeamDetails(
         "T1", "Honey Bees", "Visalia"), "L1");

      myRoster.createTeamInLeague(new TeamDetails(
         "T2", "Gophers", "Manteca"), "L1");
      
      myRoster.createTeamInLeague(new TeamDetails(
         "T3", "Deer", "Bodie"), "L2");

      myRoster.createTeamInLeague(new TeamDetails(
         "T4", "Trout", "Truckee"), "L2");

      myRoster.createTeamInLeague(new TeamDetails(
         "T5", "Crows", "Orland"), "L1");

      // Players, Team T1

      myRoster.createPlayer(new PlayerDetails(
         "P1", "Phil Jones", "goalkeeper", 100.00));
      myRoster.addPlayer("P1", "T1");

      myRoster.createPlayer(new PlayerDetails(
         "P2", "Alice Smith", "defender", 505.00));
      myRoster.addPlayer("P2", "T1");

      myRoster.createPlayer(new PlayerDetails(
         "P3", "Bob Roberts", "midfielder", 65.00));
      myRoster.addPlayer("P3", "T1");

      myRoster.createPlayer(new PlayerDetails(
         "P4", "Grace Phillips", "forward", 100.00));
      myRoster.addPlayer("P4", "T1");

      myRoster.createPlayer(new PlayerDetails(
         "P5", "Barney Bold", "defender", 100.00));
      myRoster.addPlayer("P5", "T1");

      // Players, Team T2

      myRoster.createPlayer(new PlayerDetails(
         "P6", "Ian Carlyle", "goalkeeper", 555.00));
      myRoster.addPlayer("P6", "T2");

      myRoster.createPlayer(new PlayerDetails(
         "P7", "Rebecca Struthers", "midfielder", 777.00));
      myRoster.addPlayer("P7", "T2");

      myRoster.createPlayer(new PlayerDetails(
         "P8", "Anne Anderson", "forward", 65.00));
      myRoster.addPlayer("P8", "T2");

      myRoster.createPlayer(new PlayerDetails(
         "P9", "Jan Wesley", "defender", 100.00));
      myRoster.addPlayer("P9", "T2");

      myRoster.createPlayer(new PlayerDetails(
         "P10", "Terry Smithson", "midfielder", 100.00));
      myRoster.addPlayer("P10", "T2");

      // Players, Team T3

      myRoster.createPlayer(new PlayerDetails(
         "P11", "Ben Shore", "point guard", 188.00));
      myRoster.addPlayer("P11", "T3");

      myRoster.createPlayer(new PlayerDetails(
         "P12", "Chris Farley", "shooting guard", 577.00));
      myRoster.addPlayer("P12", "T3");

      myRoster.createPlayer(new PlayerDetails(
         "P13", "Audrey Brown", "small forward", 995.00));
      myRoster.addPlayer("P13", "T3");

      myRoster.createPlayer(new PlayerDetails(
         "P14", "Jack Patterson", "power forward", 100.00));
      myRoster.addPlayer("P14", "T3");

      myRoster.createPlayer(new PlayerDetails(
         "P15", "Candace Lewis", "point guard", 100.00));
      myRoster.addPlayer("P15", "T3");

      // Players, Team T4

      myRoster.createPlayer(new PlayerDetails(
         "P16", "Linda Berringer", "point guard", 844.00));
      myRoster.addPlayer("P16", "T4");

      myRoster.createPlayer(new PlayerDetails(
         "P17", "Bertrand Morris", "shooting guard", 452.00));
      myRoster.addPlayer("P17", "T4");

      myRoster.createPlayer(new PlayerDetails(
         "P18", "Nancy White", "small forward", 833.00));
      myRoster.addPlayer("P18", "T4");

      myRoster.createPlayer(new PlayerDetails(
         "P19", "Billy Black", "power forward", 444.00));
      myRoster.addPlayer("P19", "T4");

      myRoster.createPlayer(new PlayerDetails(
         "P20", "Jodie James", "point guard", 100.00));
      myRoster.addPlayer("P20", "T4");

      // Players, Team T5

      myRoster.createPlayer(new PlayerDetails(
         "P21", "Henry Shute", "goalkeeper", 205.00));
      myRoster.addPlayer("P21", "T5");

      myRoster.createPlayer(new PlayerDetails(
         "P22", "Janice Walker", "defender", 857.00));
      myRoster.addPlayer("P22", "T5");

      myRoster.createPlayer(new PlayerDetails(
         "P23", "Wally Hendricks", "midfielder", 748.00));
      myRoster.addPlayer("P23", "T5");

      myRoster.createPlayer(new PlayerDetails(
         "P24", "Gloria Garber", "forward", 777.00));
      myRoster.addPlayer("P24", "T5");

      myRoster.createPlayer(new PlayerDetails(
         "P25", "Frank Fletcher", "defender", 399.00));
      myRoster.addPlayer("P25", "T5");

      // Players, no team

      myRoster.createPlayer(new PlayerDetails(
         "P26", "Hobie Jackson", "pitcher", 582.00));
     
      myRoster.createPlayer(new PlayerDetails(
         "P27", "Melinda Kendall", "catcher", 677.00));

      // Players, multiple teams

      myRoster.createPlayer(new PlayerDetails(
         "P28", "Constance Adams", "substitue", 966.00));
      myRoster.addPlayer("P28", "T1");
      myRoster.addPlayer("P28", "T3");

    } catch (Exception ex) {
        System.err.println("Caught an exception:");
        ex.printStackTrace();
    }

  } // insertInfo


} // class

Chaves Primárias para Container-Managed Persistence

A Classe de Chave Primária

public class PurchaseOrderKey implements java.io.Serializable {
  public String productModel;
  public String vendorId;

  public PurchaseOrderKey() { };

  public String getProductModel() {
    return productModel;
  }

  public String getVendorId() {
    return vendorId;
  }

  public boolean equals(Object other) {
    if (other instanceof PurchaseOrderKey) {
      return (productModel.equals(
               ((PurchaseOrderKey)other).productModel) &&
               vendorId.equals(
               ((PurchaseOrderKey)other).vendorId));
    }
    return false;
  }

  public int hashCode() {
    return productModel.concat(vendorId).hashCode();
  }
}

Chaves Primárias na Classe de Implementação (Entity Bean class)

public PurchaseOrderKey ejbCreate (String vendorId,
                                   String productModel,
                                   String productName)
                        throws CreateException {

  setVendorId(vendorId);
  setProductModel(productModel);
  setProductName(productName);
  return null;
}

Geração de Valores de Chaves Primárias

cmp programa