18c0693f

Компоненты данных и сеансовые компоненты


Компонент данных или сеансовый компонент могут состоять из следующих элементов: пара интерфейсов для работы с самим компонентом — удаленный интерфейс и локальный интерфейс; пара интерфейсов для поиска и создания компонентов — удаленный исходный интерфейс и локальный исходный интерфейс; класс компонента, реализующий методы работы с ним; и, для компонентов данных, — класс первичного ключа. Обязательно должен быть декларирован класс компонента и один из интерфейсов — удаленный или локальный. Для компонентов данных обязательно должен быть определен класс первичного ключа.



Ниже приведены примеры декларации класса компонента и интерфейсов для компонентов данных, соответствующих простой схеме из двух таблиц, которая изображена на рис. 14.5.



В рамках этой схемы, состоящей из таблиц, где хранятся данные книг и организаций-издателей, каждая книга связана с одним и только одним издателем, а каждый издатель может иметь ссылки на некоторое множество книг (возможно, пустое). Каждая таблица имеет поле ID, являющееся первичным ключом. Таблица Book имеет поле PublisherID, содержащее значение ключа записи об издателе данной книги.


Рис. 14.5.  Пример схемы БД

Примеры кода удаленных интерфейсов для компонентов, представляющих данные о книгах и издателях в рамках EJB-приложения:

package ru.msu.cmc.prtech.examples;

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

public interface PublisherRemote extends EJBObject { public String getTitle () throws RemoteException; public void setTitle (String title) throws RemoteException;

public Collection getBooks ()throws RemoteException; public void setBooks (Collection books) throws RemoteException;

public void addBook (String title, String isbn) throws RemoteException; public void removeBook (String title, String isbn) throws RemoteException; }

package ru.msu.cmc.prtech.examples;

import java.rmi.RemoteException;

import javax.ejb.EJBObject;

public interface BookRemote extends EJBObject { public String getTitle () throws RemoteException; public void setTitle (String title) throws RemoteException;

public String getISBN () throws RemoteException; public void setISBN (String isbn) throws RemoteException;

public PublisherRemote getPublisher () throws RemoteException; public void setPublisher (PublisherRemote publisher) throws RemoteException; }

Пример 14.1.

Примеры кода удаленных исходных интерфейсов.

package ru.msu.cmc.prtech.examples;

import java.rmi.RemoteException;

import javax.ejb.CreateException; import javax.ejb.EJBHome; import javax.ejb.FinderException;

public interface PublisherHomeRemote extends EJBHome { public PublisherRemote create (Integer id) throws CreateException, RemoteException;

public PublisherRemote findByPK (Integer id) throws FinderException, RemoteException; }



package ru.msu.cmc.prtech.examples;

import java.rmi.RemoteException;

import javax.ejb.CreateException; import javax.ejb.EJBHome; import javax.ejb.FinderException;

public interface BookHomeRemote extends EJBHome { public BookRemote create (Integer id) throws CreateException, RemoteException;

public BookRemote createBook (String title, String isbn) throws CreateException, RemoteException;

public BookRemote findByPK (Integer id) throws FinderException, RemoteException; }

Пример 14.2.

Примеры кода классов компонентов. Показано, как реализовывать дополнительные, не поддерживаемые контейнером автоматически, методы работы со связями между данными об издателях и книгах и дополнительные методы создания компонентов.

package ru.msu.cmc.prtech.examples;

import java.util.Collection; import java.util.Iterator;

import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EntityBean; import javax.naming.InitialContext; import javax.naming.NamingException;

public abstract class PublisherBean implements EntityBean { public Integer ejbCreate (Integer pk) { setId(pk); return null; }

public void ejbPostCreate (Integer pk) { }

public abstract Integer getId (); public abstract void setId (Integer pk);

public abstract String getTitle (); public abstract void setTitle (String title);

public abstract Collection getBooks (); public abstract void setBooks (Collection books);

public void addBook (String title, String isbn) { try { InitialContext context = new InitialContext(); BookHomeRemote bookHome = (BookHomeRemote)context.lookup("BookHomeRemote"); BookRemote book = bookHome.createBook(title, isbn);

Collection books = getBooks(); books.add(book); } catch (NamingException e) { e.printStackTrace(); } catch (CreateException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } }

public void removeBook (String title, String isbn) { Collection books = getBooks(); Iterator it = books.iterator();

try { while(it.hasNext()) { BookRemote book = (BookRemote)it.next(); if( book.getTitle().equals(title) && book.getISBN().equals(isbn) ) { it.remove(); break; } } } catch (RemoteException e) { e.printStackTrace(); } } }

package ru.msu.cmc.prtech.examples;

import javax.ejb.EntityBean;

public abstract class BookBean implements EntityBean { public Integer ejbCreate (Integer pk) { setId(pk); return null; }

public void ejbPostCreate (Integer pk) { }

public Integer ejbCreateBook (String title, String isbn) { setTitle(title); setISBN(isbn); return null; }

public void ejbPostCreateBook (String title, String isbn) { }

public abstract Integer getId (); public abstract void setId (Integer pk);

public abstract String getTitle (); public abstract void setTitle (String title);

public abstract String getISBN (); public abstract void setISBN (String isbn);

public abstract PublisherRemote getOrganization (); public abstract void setOrganization (PublisherRemote pr); }

Пример 14.3.