Главная » Java, JavaBeans » Реализация Entity-Компонента

0

очень похожа на реализацию Session- Компонента. Вы должны реализовать методы home-интерфейса, remote- интерфейса и создать собственно класс Компонента. Этот класс должен содержать методы, которые соответствуют методам, объявленным в home- и remote-интерфейсах.

Базовым классом для класса Entity-Компонента является класс

EntityBean, а не SessionBean.

Обратитесь к разделу "Remote-интерфейс" на странице 7-16 для получения информации о разработке remote-интерфейса.

Обратитесь к разделу "Ноте-интерфейс Entity-Компонента " на странице 7-15 для получения информации о разработке home- интерфейса Entity-Компонента. Вам следует предварительно ознакомиться с материалом, посвященному созданию Session- Компонентов (глава 6 "Написание Session-Компонентов").

Класс Entity-Компонента должен реализовать:

•        Интерфейс EntityBean.

•        Методы, которые соответствуют методам home-интерфейса – в частности, create-методам и, для Компонентов с BMP, finder-методам.

•        Методы, которые соответствуют методам remote-интерфейса – бизнес- методы и методы интерфейса EntityBean.

Класс EntityBean также содержит реализацию бизнес-методов, которые являются специфическими для этого Entity-объекта. Дополнительно, для Компонента с BMP, он должен включать в себя методы для доступа и изменения информации в базе данных.

Класс Entity-Компонента

данных и удалением Entity-объекта из базы данных. Это

обеспечивается надлежащей реализацией методов интерфейса

EntityBean – ejbLoad(), ejbStore(), ejbRemove() – и метода

ejbCreate().

Определение интерфейса EntityBean приведено в Примере Кода 7.1

Пример Кода 7.1 Определение интерфейса EntityBean

package javax.ejb;

import java.rmi.RemoteException;

public interface EntityBean extends EnterpriseBean {

public void setEntityContext (EntityContext ctx) throws

EJBException, RemoteException; public void unsetEntityContext()throws EJBException,

RemoteException; public void ejbRemove()throws RemoveException, EJBException, RemoteException;

public void ejbActivate() throws EJBException, RemoteException; public void ejbPassivate() throws EJBException, RemoteException; public void ejbLoad() throws EJBException, RemoteException; public void ejbStore()throws EJBException, RemoteException;

}

Интерфейс содержит следующие методы.

•     setEntityContext () – устанавливает контекст Компонента. Контейнер использует этот метод для передачи ссылки на интерфейс EntityContext экземпляру Компонента. Этот интерфейс содержит методы, которые позволяют получить доступ к свойствам среды исполнения Компонентов. Компонент, который использует этот контекст, должен хранить эту ссылку в одном из своих полей.

•     unsetEntityContext () – вызывается Контейнером перед тем, как происходит уничтожение текущего экземпляра Entity-Компонента. Здесь Компонент может освободить ресурсы, которые были захвачены в процессе выполнения кода метода setEntityContext ().

•     ejbRemove () – удаляет запись или записи из базы данных, ассоциированные с этим Entity-Компонентом. Контейнер вызывает этот метод в ответ на вызов клиентом метода remove ().

•     ejbActivate () – уведомляет Компонент о том, что он только что был активизирован. Контейнер вызывает этот метод для экземпляра, выбранного из пула доступных экземпляров, и сопоставляет с ним identity конкретного Entity-объекта. В процессе выполнения активизации экземпляр Entity-Компонента имеет возможность затребовать необходимые дополнительные ресурсы.

возвращен в пул доступных экземпляров. В этом месте экземпляр имеет возможность освободить ресурсы, которые были захвачены в процессе выполнения метода ejbActivate () и которые не имеет смысла хранить при попадании объекта в пул.

•     ejbLoad() – обновляет данные Компонента, считывая их из базы данных. Контейнер вызывает этот метод для экземпляра Компонента для выполнения синхронизации состояния полей экземпляра с состоянием информации в базе данных.

•     ejbStore() – помещает данные из полей Компонента в базу данных. Контейнер вызывает этот метод для экземпляра Компонента, чтобы синхронизировать состояние базы данных с кешированными значениями полей Компонента.

Методы Entity-Компонента

Для Entity-Компонента обычно объявлены и реализованы create- и finder-методы.

Методы для создания (create-методы)

Для Entity-Компонента должны быть объявлены и реализованы методы ejbCreate () и ejbPostCreate (), которые соответствуют методам create (), объявленным в home-интерфейсе. Помните, что класс Компонента не обязан реализовывать create-методы. Результатом вызова create-метода является добавление новой информации в базу данных. Вы можете создать Entity-Компонент, не имеющий таких методов, когда новые данные в БД (т.е. новые Entity-объекты) добавляются с помощью средств DBMS или унаследованных систем.

Имена create-методов в классе реализации Компонента должны совпадать с именами соответствующих методов в home-интерфейсе, за исключением префикса "ejb". Списки аргументов (как число, так и их тип) должны быть одинаковыми.

Вызов метода ejbCreate () для Entity-Компонента приводит к добавлению нового Entity-объекта в базу данных. Хотя методы create () home-интерфейса возвращают ссылку на remote-интерфейс, соответствующие им методы ejbCreate () класса Компонента возвращают значение primary key (главного ключа). Для Entity- Компонента с СМР результатом метода ejbCreate () является null. Это происходит потому, что за создание объекта полностью отвечает Контейнер. Для Entity-Компонента с BMP метод ejbCreate () возвращает экземпляр класса primary key для вновь созданного Entity-объекта. Контейнер использует это значение для создания экземпляра Entity- Компонента.

Сигнатуры методов ejbCreate () для Entity-Компонентов не зависят от типа управления сохранением (т.е. BMP или СМР) и имеют следующий вид:

public <PrimaryKeyClass> ejbCreate( <zero or more parameters> ) 11 implementation

}

Обратите внимание, что сигнатура метода ejbCreate() для Entity- Компонента требует возврата класса primary key. Entity-Компоненты с СМР не использует при возврате значение primary key, т.к. на самом деле новый экземпляр Компонента создается Контейнером. Вместо этого, разработчик Компонента в качестве значения результата метода ejbCreate() возвращает null.

Метод ejbCreate() вызывается Контейнером в ответ на вызов клиентом метода create (), и новые данные, представлением которых является вновь созданный объект, записываются в базу данных. Затем Контейнер вызывает соответствующий метод ejbPostCreate () для того, чтобы позволить экземпляру Компонента завершить процесс инициализации. Метод ejbPostCreate () должен соответствовать методу ejbCreate() по списку аргументов, но не по типу результата (он возвращает тип void). Вот его сигнатура:

public void ejbPostCreate! <zero or more parameters> ) throws RemoteException { // implementation

}

Методы ejbCreate() обычно используются для выполнения инициализации, поэтому они часто имеют те или иные аргументы и их реализация содержит код, который использует значения аргументов для установки начального состояния Entity-объекта. Например, пример bank для работы со счетами использует Entity-Компонент, чей метод ejbCreate() имеет два аргумента типов string и float. Значение string- аргумента используется для задания названия счета, а аргумент типа float – для задания его состояния, как показано в Примере Кода 7.2:

Пример кода 7.2 Метод ejbCreate() примера Bank

public AccountPK ejbCreate(String name, float balance) { this name = name; this balance = balance; return null;

}

Методы поиска (finder-методы)

Entity-Компонент с BMP должен также обеспечить реализацию методов поиска, которые соответствуют методам поиска home-интерфейса. Имена таких методов в классе реализации и в home-интерфейсе должны совпадать, за исключением префикса "ejb". Списки аргументов – как количество, так и тип – должны быть одинаковыми.

Entity-Компонент с СМР не реализует методы поиска, соответствующие методам поиска home-интерфейса. Для таких Компонентов реализацию finder-методов обеспечивает Контейнер. Тем не менее, чтобы Контейнер мог это сделать, вы должны поместить определенную информацию в Дескриптор Поставки. Реализация Inprise Контейнера EJB предусматривает для этого специальные поля.

Ноте-интерфейс обязан объявить базовый метод поиска, findByPrimaryKey (primaryKey), для выполнение поиска объекта по значению его главного ключа. Метод имеет единственный аргумент – значение ключа – и возвращает remote-интерфейс для найденного объекта:

public <entity bean ‘ s rem te interface> findByPrimaryKey! <primary key type> key )

throws java.rmi.RemoteException, javax.ejb.FinderException; Ноте-интерфейс может объявлять и дополнительные методы поиска. Для каждого метода, включая findByPrimaryKey (), в классе Компонента должна присутствовать соответствующая реализация (при использовании BMP). Помимо методов ejbCreate (), класс Компонента содержит метод ejbFindByPrimaryKey () и методы ejbFind<methodname> (), которые соответствуют методам поиска home-интерфейса.

Метод поиска может возвращать как один, так и несколько объектов. В любом случае, при использовании СМР метод возвращает тип java.util.Collection для Java 2 и java.util.Enumeration для более ранних версий JDK. При извлечении из Collection – или Enumeration каждого отдельного элемента необходимо выполнить его преобразование к типу remote-интерфейса.

Если же используется СМР и метод поиска возвращает несколько объектов, то это должна быть Collection – или Enumeration – главных ключей, который Контейнер преобразует к набору ссылок на remote- интерфейсы.

Бизнес-логика

Класс Entity-Компонента должен также обеспечить реализацию тех бизнес-методов, которые объявлены в remote-интерфейсе. Сигнатуры методов в классе и сигнатуры методов в remote-интерфейсе должны полностью совпадать.

Нет никакой необходимости определять конструктор для класса Entity- Компонента. Все необходимые действия по инициализации Компонента выполняются методами ejbCreate ().

с СМР должна объявлять как public те переменные, которые должны управляться Контейнером. В случае BMP переменные могут быть объявлены как public, так и private.

Синхронизация методов

Эта тема затрагивает вопросы одновременного доступа к Entity- Компонентам и создания реентерабельных (reentrant) Компонентов.

Одновременный доступ к Entity-Компонентам

Проблемами синхронизации вызовов методов при одновременном доступе к Компонентам занимается Контейнер, и разработчику Компонента (bean provider) нет необходимости беспокоиться об этом. Контейнер обычно использует одну из двух стратегий: синхронизация на уровне баз данных или синхронизация на уровне Контейнера.

При синхронизации на уровне баз данных, Контейнер просто создает несколько экземпляров одного и того же Компонента, а вопросы синхронизации решаются при вызовах к БД, выполняемых из методов

ejbCreate(), ejbRemove(), ejbLoad() и ejbStore().

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

Реентерабельные Entity-Компоненты

По умолчанию к Entity-Компонентам нельзя обращаться повторно в контексте одной транзакции – это приводит к возникновению исключения j ava. rmi. RemoteException.

Вы можете объявить, что Компонент является реентерабельным с помощью установки параметров Дескриптора Поставки; тем не менее, при этом нужно быть очень осторожным. Главная проблема состоит в том, что Контейнер в общем случае не может отличить повторный вызов в контексте одной транзакции и конкурентный вызов метода того же самого Компонента (в контексте той же транзакции).

К одному и тому же экземпляру Компонента, помеченного как реентерабельный, нельзя обращаться одновременно нескольким клиентам в контексте одной транзакции. Обеспечить выполнение этого требования – обязанность программиста.

Главные (первичные) ключи Entity-Компонента

Каждый экземпляр Entity-Компонента должен иметь сопоставленный с ним главный ключ. Главный ключ представляет собой значение (или комбинацию значений), которое уникальным образом идентифицирует данный экземпляр. Например, в таблице базы данных, которая содержит записи о сотрудниках предприятия, в качестве главного ключа может использоваться номер социального страхования. Представляется естественным, если Entity-Компонент, являющийся объектным представлением записи в таблице, также будет использовать это значение в качестве своего главного ключа.

Применительно к Компонентам EJB главный ключ реализуется с помощью Java-класса, содержащего уникальное значение. Этим классом может быть любой корректный RMI-IIOP – класс. В частности, это означает, что он реализует интерфейс j ava. io. Serial izable. Этот класс должен также обеспечить реализацию методов Object.equals (Object other) и Object.hashCode (), т.е. двух методов, которые по определению наследуют все Java-классы.

Класс главного ключа является специфическим для приложения. Другими словами, каждый Entity-Компонент может иметь свой собственный класс главного ключа. С другой стороны, нескольким Компонентам разрешено использовать один и тот же класс.

Пример bank использует два различных Entity-Компонента для представления различных видов счетов. Оба вида счета используют одно и то же поле в качестве ключевого – для уникальной идентификации записи в таблице. По этой причине один и тот же класс, AccountPK, использовался в качестве класса primary key для обоих видов счетов. Определение этого класса показано в Примере Кода 7.3:

Пример Кода 7.3 Главный ключ класса Account

public class AccountPK implements java.io.Serializable { public String name; public AccountPK() {} public AccountPK(String name) { this name = name;

}

}

Источник: Руководство программиста Enterprise JavaBeans

По теме:

  • Комментарии