Создание объектов

Entity-объект представляющий CD очень прост для кодирования, так как он не содержит в себе никаких сложных задач. Все проблемы сохранения состояния возьмет на себя сервер. Я представляю полный код этого объекта ниже; код для объекта CDCollection не будет обсуждаться, так как он не интересен в контексте контейнерно-управляемого сохранения состояния.

CD.java: remote-интерфейс для объекта "CD"

package org.jboss.docs.cmp.cd.interfaces;

import javax.ejb.EJBObject;
import java.rmi.RemoteException;

/**
 * Этот интерфейс определяет remote-интерфейс для объекта CD
 */
public interface CD
extends EJBObject
{
   public Integer getId() throws RemoteException;

   public void setId(Integer id) throws RemoteException;

   public String getTitle() throws RemoteException;

   public void setTitle(String title) throws RemoteException;

   public String getArtist() throws RemoteException;

   public void setArtist(String artist) throws RemoteException;

   public String getType() throws RemoteException;

   public void setType(String type) throws RemoteException;

   public String getNotes() throws RemoteException;

   public void setNotes(String type) throws RemoteException;

}

Remote-интерфейс определяет методы для получения (get) и установки (set) атрибутов объекта. Вот и всё что от него нужно в рамках этого примера. Заметьте, что, как и с любым JavaBean, имена этих методов следуют стандартному соглашению, т.е. если существует атрибут называемый "String X" тогда методы для получения (get) и установки (set) этого атрибута должны быть определены следующим образом:

String getX();
void setX(String x);

Однако вы можете объявить любые методы, которые возвращают информацию о состоянии этого entity-объекта. Эти методы должны быть реализованы программистом в реализации класса для entity-объекта.

CDHome.java: home-интерфейс для объекта "CD"

package org.jboss.docs.cmp.cd.interfaces;

import javax.ejb.EJBHome;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
import java.rmi.RemoteException;
import java.util.Collection;

/**
 * Этот интерфейс определяет home-интерфейс для объекта CD
 */
public interface CDHome
extends EJBHome
{

   /**
    * Создает новый экземпляр объекта CD
    */
   public CD create(Integer id)
   throws RemoteException, CreateException;

   /**
    * Находит экземпляр CD с определенным ID. Этот метод реализуется контейнером
    */
   public CD findByPrimaryKey (Integer id)
   throws RemoteException, FinderException;

   /**
    * Находит CD у которого атрибут "type" совпадает с указанным.
    * Этот метод реализуется контейнером
    */
   public Collection findByType (String type)
   throws RemoteException, FinderException;

   /**
    * Получает все экземпляры CD. Этот метод реализуется контейнером
    */
   public Collection findAll()
   throws RemoteException, FinderException;

}

Заметим важную вещь об этом интерфейсе, который определяет методы, которые не должны быть реализованы. В нашем случае, findByPrimaryKey(), findByType() и findAll() это примеры методов поиска (finder methods). Спецификация EJB требует от сервера возможности обеспечения работы таких методов для всех сохраняемых атрибутов в объекте. Так, для примера, если ваш класс имеет атрибут "X", тогда сервер предоставит метод "findByX" для поиска по этому полю. Заметим, что поиск в JBoss "точный", т.е. он не допускает шаблонов поиска (wild-card characters) или некорректное смешивание символов в верхнем и нижнем регистре. Метод findByPrimaryKey() ищет по первичному ключу, мы позже обсудим как определяется первичный ключ.

CDBean.java: реализация объекта "CD"

package org.jboss.docs.cmp.cd.bean;

import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
import java.rmi.RemoteException;

/**
 * Этот класс содержит реализацию методов, определенных в home-
 * и remote-интерфейсах для объекта "CD"
 */
public class CDBean
implements EntityBean
{
   EntityContext ctx;

   public Integer id;
   public String title;
   public String artist;
   public String type;
   public String notes;

   /**
    * Создает экземпляр CD. Заметим, что этот метод возвращает null из-за того, что настоящее 
    * создание управляется EJB-контейнером.
    */
   public Integer ejbCreate (Integer _id)
   {
      id = _id;
      return null;
   }

   /**
    * Вызывается когда создан новый экземпляр объекта; в нашем примере ничего не делает
    */
   public void ejbPostCreate(Integer id) { }

   public String getTitle() { return title; }
   public void setTitle(String _title) { title = _title; }

   public Integer getId() { return id; }
   public void setId(Integer _id) { id = _id; }

   public String getArtist() { return artist; }
   public void setArtist(String _artist) { artist = _artist; }

   public String getType() { return type; }
   public void setType(String _type) { type = _type; }

   public String getNotes() { return notes; }
   public void setNotes(String _notes) { notes = _notes; }

   public void setEntityContext(EntityContext ctx) { this.ctx = ctx; }

   public void unsetEntityContext() { ctx = null; }

   public void ejbActivate() { }
   public void ejbPassivate() { }
   public void ejbLoad() { }
   public void ejbStore() { }
   public void ejbRemove() { }

}

Класс CDBean предоставляет реализацию методов, которые не предоставляются EJB-контейнером автоматически. Заметим, что метод ejbCreate возвращает "null", что значит, что контейнер должен позаботиться об инициализации экземпляра в сервере. Из за того, что объект CD, по существу, пассивен -- хранилище данных -- он имеет всего-лишь несколько методов.

Наши друзья