Advanced   Java   Services Entity Beans 3.0 Back Next Up Home


3) Entity arbeitet mit einer Sessionbean zusammen die auf Derby zugreift


Das Beispiel besteht serverseitig aus den folgenden Dateien

Zusammen mit der obligatorischen aber trivialen Datei Manifest.MF werden die Dateien in ein Archiv gepackt. Dieses kann die der Endung .ear oder .jar haben. Der Aufbau des Archivs entpricht der im ersten Beispiel geschilderten Struktur.

Die Entity Movie


/*
   02.10.2010 17:27:26 com.sun.corba.ee.impl.encoding.CDRInputStream_1_0 read_value
   WARNUNG: "IOP00810257: (MARSHAL) Could not load class org.apache.derby.client.am
   .SqlException<>"
   org.omg.CORBA.MARSHAL:   vmcid: SUN  minor code: 257 completed: Maybe
           at com.sun.corba.ee.impl.logging.ORBUtilSystemException.couldNotFindClas
   s(ORBUtilSystemException.java:9772)

   eine tabelle mit vier spalten funzt nicht ???
*/
import java.io.Serializable;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;

@Entity
@Table(name="moviedatabase")
public class Movie implements Serializable
{
   @Id
   @GeneratedValue
   private int id;
   private String director;
   private String title;

   public Movie()
   {
      director = title = "";
      //year = 0;
   }


   public Movie(String director, String title)
   {
     this.director = director;
     this.title = title;
   }

   public int getId()
   {
      return id;
   }

   public void setId(int id)
   {
      this.id = id;
   }

   public String getDirector()
   {
     return director;
   }

   public void setDirector(String director)
   {
     this.director = director;
   }

   public String getTitle()
   {
     return title;
   }

   public void setTitle(String title)
   {
     this.title = title;
   }

 }  // end class Movie



Der MovieHandler (RemoteInterface)


Der MovieHandler der vorigen Beispiel wird in zwei Teile zerlegt. Die Deklaration der Methoden, die die Tabelle manipulieren wandert ins RemoteInterface, die Implementierung in die Bean.

/*
   remoteinterface
   wird von MoviesBean implementiert (sessionbean)
   verwendet die entityklasse Movie
*/

import java.util.List;
import javax.ejb.Remote;

@Remote
public interface MovieHandler
{
   void addMovie(Movie movie);

   boolean deleteMovie(Object primaryKey);

   List<Movie> listMovies();

} // end MovieHandler


Die Beanklasse MovieBean


/*
   SessionBean
*/

import java.util.List;
import javax.ejb.Remote;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.persistence.Query;
import javax.annotation.PreDestroy ;
import javax.persistence.Persistence;
import javax.annotation.PostConstruct ;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;


@Stateful(name="MovieHandler", mappedName="ejb/MovieHandler")
@Remote(MovieHandler.class)

public class MoviesBean implements MovieHandler
{
   @PersistenceContext(unitName = "movies", type = PersistenceContextType.TRANSACTION)
   private EntityManager entityManager;

   public MoviesBean()
   {
   }

   // ------------------- business methods ------------------- \\
   @Override
   public void addMovie(Movie movie)
   {
      //entityManager.getTransaction().begin();
      // darf bei sessionsbeans nicht benützt werden !!!
      entityManager.persist(movie);
      //entityManager.getTransaction().commit();
      // darf bei sessionsbeans nicht benützt werden !!!
      // Cannot use an EntityTransaction while using JTA
   }

   @Override
   public boolean deleteMovie(Object primaryKey)
   {
      Movie movie = entityManager.find(Movie.class,primaryKey) ;
      if (movie!=null)
      {
         entityManager.remove(movie);
         return true;
      }
      return false;
   }

   @Override
   public List listMovies()
   {
      Query query = entityManager.createQuery("SELECT m from Movie as m");
      return query.getResultList();
   }

   // ------------------- optional methods ------------------- \\
   @Remove
   public void remove()       // name der methode ist jetzt beliebig
   {
      System.out.println("------- remove -------");
      //entityManager.close();
   }

   @PostConstruct
   public void postConstruct()  // name der methode ist jetzt beliebig
   {
      System.out.println("------- postConstruct -------");
   }

   @PreDestroy
   public void preDestroy()   // name der methode ist jetzt beliebig
   {
      System.out.println("------- preDestroy -------");
   }

} // end class MoviesBean


Die Datei persistence.xml


In dieser Datei wird der Zugriff auf die Datenbank konfiguriert. Wir verwenden Derby von Glassfish. Da Derby die hauseigene Datenbank von Glassfish ist, vereinfacht sich diese Datei wie folgt.

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

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">

   <persistence-unit name="movies" transaction-type="JTA"> <!-- JTA notwendig -->
      <provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
      <class>Movie</class>
      <properties>
         <property name="toplink.ddl-generation" value="drop-and-create-tables"/>
      </properties>
   </persistence-unit>

</persistence>

Damit haben wir alle Bausteine erstellt. Die Angabe eines Datenbanktreibers ist hier nicht notwendig.

Der Client


/*

*/
import java.util.*;
import javax.naming.*;

public class MovieClient
{

   public static void main(String[] args)
   {
      System.out.println("about to create initialcontext");
      String jndiName = "ejb/MovieHandler";

      Properties env = new Properties();
      env.put("org.omg.CORBA.ORBInitialHost","<My-IP-Adress>");  // default ist localhost !!
      //env.put("org.omg.CORBA.ORBInitialPort","3700");  // ist default
      env.put("java.naming.factory.initial","com.sun.enterprise.naming.SerialInitContextFactory");
      // die factory greift immer auf localhost zu, wenn der CORBAHost nicht gesetzt wird
      //env.put("java.naming.factory.url.pkgs","com.sun.enterprise.naming");  // nicht notwendig
      //env.put("java.naming.provider.url","com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");  // nicht notwendig
      //env.put("java.naming.factory.state",url);  // nicht notwendig

      try
      {
         Context ctx = new InitialContext(env);   // NamingException
         System.out.println("initial context received");

         MovieHandler mh = (MovieHandler)ctx.lookup(jndiName);    // NamingException
         System.out.println("MovieHandler = " + mh);
         List<Movie> list = mh.listMovies();
         printMovies(list);

         Movie movie = new Movie("fritz lang","metropolis");
         mh.addMovie(movie);

         System.out.println("nach addMovie");

         list = mh.listMovies();
         printMovies(list);
      }
      catch(NamingException ex)
      {
         System.out.println("NamingException " + ex);
      }
      catch(Exception ex)
      {
         System.out.println("Exception " + ex);
      }
      // ende try - catch
      System.out.println("-------------------------------------");

   }  // end main


   public static void printMovies(List<Movie> list)
   {
      if( list.size() == 0)
      {
         System.out.println("--------- no movies in the database ----------");
         return;
      }

      Iterator iter = list.iterator();
      while(iter.hasNext())
      {
         Movie movie = (Movie)iter.next();
         System.out.println(movie.getId() );
         System.out.println(movie.getDirector() );
         System.out.println(movie.getTitle() );
         //System.out.println(movie.getYear() );
      }
   }

} // end class MovieClient

Screenshot des Ablaufs



top Back Next Up Home