Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

JAVA. Серверные приложения

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
2 Мб
Скачать
Часть 4. Распределенные компненты EJB 231
32.2. EJB JAR архив
Создание jar-архива, содержащего EJB, не отличается от создания
обычного архива, содержащего другие Java EJB. EJB jar-архив может содержать как один, так и несколько разработанных EJB. Для создания jar-архива можно воспользоваться утилитой jar.exe, входящей в постав­ку стандартного JDK, или воспользоваться инструментами разработки. EJB JAR-файл используется для пакетирования Enterprise beans. Файл использует стандартный формат Java-архивов.
JAR-архив, содержащий классы Enterprise bean и известный как
EJB JAR-файл, должен иметь следующие EJB:
Классы для каждого EJB EJB.
Дополнительные классы и файлы, необходимые при использовании
созданных EJB, например, классы пользовательских исключений, файлы свойств, классы ресурсов. Дескриптор Enterprise bean.
Файл manifest, описывающий содержание EJB JAR-файла. Мани-
фест генерируется самостоятельно при архивировании классов En­terprise bean.
32.3. Установка EJB
Установка EJB осуществляется добавлением в контейнер, в среде ко-
торого Enterprise bean и будут выполняться. Помещение в EJB-контей­нер сопровождается дополнительными генерациями служебных объек­тов. На основе созданных классов Entity bean инструмент разработки создает два класса: EJBHome и EJBObject, основанные на home- и re­mote-интерфейсах Enterprise bean. Также автоматически генерируются заглушки (stub) и скелетон классы используемые, RMI. Enterprise bean взаимодействует с контейнером тремя различными способами: через вызываемые методы, при помощи объекта, использующего интерфейс EJBContext, и через указание объекта, доступ к которому осуществля­ется посредством Java Naming and Directory Interface (JNDI). Каждый Enteprice bean реализует несколько методов, наследованных из интер­фейса EJB. Все методы вызывают различные события либо в самом контейнере, либо в жизненном цикле EJB, такие, как активация, под­ключение к базе данных, включение транзакции и подобные. EJBCon­text — обязательный объект любого Enteprice bean, через даный объект Enteprice bean получает информацию о системном окружении в контей­нере, Java Naming and Directory Interface (JNDI) представляет собой стандартное расширение Java, обеспечивая доступ к именованным сис­темам подобной LDAP, обычной файловой системе и т. д. Всякий bean автоматически получает доступ к именованной системе, называемой Environment Naming Context (ENC). ENC управляется контейнером для организации доступа к Java Naming and Directory Interface (JNDI). JNDI ENC организует доступ к другим источникам посредством JDBC или другим EJB.
При помещении в контейнер создаются дополнительные элементы,
такие, как заглушки и скелетоны, необходимые при работе RMI, а так-
232 Часть 4. Распределенные компненты EJB
же классы EJBObject и EJBHome из существующих интерфейсов со­зданного EJB, home- и remote-интерфейсов. При помещении Entity be­an в контейнер также создаются классы, использующие методы find() и содержащие переменные для работы с данными, пользующиеся метода­ми find().
Глава 33. Создание EJB приложения
Разработка Enterprise bean включает ряд требований, необходимых
для создания компонентов. Можно, конечно же, создавать EJB вручную, используя лишь стандартный JDK, классы и интерфейсы пакета ja­vax.ejb.*; инструмент, поставляемый вместе с J2sdkee и текстовым ре­дактором. Значительно удобнее использовать уже готовые инструмен­ты, интегрированные среды разработки (IDE), например, такие, как Vi­sual Age for Java фирмы IBM или Jbuilder, компании INPRISE.
Основные этапы создания EJB:
1. Объявление и написание кода основного класса EJB. Это и есть ре-
ализация бизнес-логики.
2. Написание remote-интерфейса EJB.
3. Написание home-интерфейса EJB.
4. Компиляция и построение EJB и его клиента.
5. Создание Дескриптора Поставки в каталоге META-INF.
6. Задание класса так называемого Primary Key EJB. Этот класс не-
обходим только при создании Entity-bean, и его имя хранится в деск­рипторе.
7. Упаковка EJB.
8. Загрузка EJB в JAR-файл.
9. Запуск приложения-клиента. Между home- и remote-интерфейсами и классом EJB не существует
никаких формальных отношений, подобных отношению наследования. Тем не менее спецификация определяет правила, которым должны под­чиняться, например, имена методов, объявленных в этих двух интер­фейсах и классе. Например, если вы объявили некоторый метод класса EJB, реализующий часть его функциональности (бизнес-логики), то точно такой же метод — с тем же именем и такой же сигнатурой — должен быть объявлен в remote-интерфейсе. Реализация EJB имеет как минимум один метод с именем ejbCreate(). Она может и иметь не­сколько методов с таким именем, но различными аргументами. Каждо­му из таких методов должен быть поставлен в соответствие метод с та­ким же списком аргументов, но с именем create(). Другое отличие состо­ит в òîì, ÷òî метод ejbCreate() класса возвращает другой тип результата по сравнению с методом create() home-интерфейса: create() возвращает тип remote-интерфейса, а ejbCreate() либо void (в случае использования сохранения, управляемого контейнером, CMP), либо тип Primary Key EJB (при использовании сохранения, управляемого Компо­нентом, BMP).
Часть 4. Распределенные компненты EJB 233
Обратите внимание на то, что метод ejbCreate() имеет свои особенно-
сти при работе с Entity-EJBми. Реализация Entity bean может вообще не реализовывать метод ejbCreate(). Обычно это происходит, если такие EJB создаются не по запросу клиента, а автоматически, например, при добавлении новых записей в базу данных, представлением чего являют­ся Entity bean. Типом возвращаемого значения для метода ejbCreate() является класс Primary Key EJB. Метод ejbCreate() для Entity bean c CMP должен возвращать void, для Entity bean BMP — класс Primary Key. Связь между классом EJB и его home- и remote-интерфейсами обеспечивает контейнер. Контейнер EJB также гарантирует (либо на этапе компиляции, либо на этапе выполнения) соответствие между классом EJB и его remote-интерфейсом. Каждый EJB должен иметь re­mote-интерфейс. Этот интерфейс содержит методы, определяющие биз­нес-логику приложения, к которым обращается его клиент. Класс EJB предназначен главным образом для реализации этих методов. Имейте в виду, что клиент не может непосредственно обращаться к методам EJB, доступ возможен только через remote-интерфейс.
Существуют две стратегии создания EJB(entity bean). Первая стро-
ится на использовании Bean Managed Persistence (BMP). В этом случае логика описывается через доступ к базе данных, весь необходимый код по работе с базой данных содержится в entity bean. Другая Container Managed Persistence (CMP), где доступ к базе данных обрабатывается в EJB-контейнере, который управляет работой взаимодействия entity be­an и базой данных. Поэтому разработка entity bean c помошью CMP значительно легче.
Создание EJB-приложения, Enterprise bean и EJB-клиента — три
основных этапа, после прохождения которых разработчик получает фи­нансовое поощрение, а заказчик — готовое приложение. EJB-приложе­ние может состоять из одного или нескольких классов session bean, од­ного или более Entity bean или из разных Enterprise bean. Программно два основных Enterprise bean очень похожи между собой, но первый (Entity bean), содержит дополнительный класс — primary key о кото­ром будет сказано ниже.
Home interface обоих Enterprise bean описывают методы жизненного
цикла, а remote interface содержит бизнес-методы EJB.
Взаимодействие клиента с методами EJB осуществляется за счет
вызова методов home- и remote-интерфейсов.
33.1. Создание Entity bean при помощи CMP
Использование специальной методики Container Managed Persistence
(CMP) облегчает создание Entity bean. Разработчику нет необходимости переопределять методы работы bean с источником данных. При исполь­зовании данного способа создания Entity bean на плечи разработчика ложится только описание бизнес-методов, всем остальным занимается контейнер. Контейнер определяет взаимодействие между Entity bean и источником данных. Каждый создаваемый Entity bean должен содер­жать основные EJB:
234 Часть 4. Распределенные компненты EJB
основной класс EJB; Home-интерфейс; Remote-интерфейс; Primary key класс. основной класс Entity bean.
В основном классе содержатся бизнес-методы, реализуемые Entity
bean, методы создания экземпляра Entity bean в контейнере, а также методы, используемые контейнером по работе с Entity bean. Клиент ни­когда не имеет доступа к бизнес-методам напрямую. Для получения до­ступа к бизнес-методам используются два специальных интерфейса — remote и home. Каждый основной класс Entity bean должен отвечать следующим требованиям:
1. Не должен быть абстрактным, должен использовать интерфейс ja-
vax.ejb.EntityBean.
2. Должен содержать переменные. Переменные, описанные в Entity
bean, могут быть временными, а могут храниться в базе данных. Они не должны быть статичными, иметь уровень доступа public. Переменные также не могут быть объявлены как финальными (final). Непостоянные переменные не хранятся в базе данных и не должны использоваться клиентом. В дескрипторе содержится описание переменных, используе­мых в Entity bean. Часто используемой переменной в основном классе Entity bean переменная, определяющая системное окружение Entity be­an, объект класса EntityContext.
3. Описывать бизнес-методы для работы с переменными. Бизнес-ме-
тоды определяют, каким способом вызываются данные из источника данных и как данные обрабатываются. Бизнес-методы не могут вызыва­ться непосредственно EJB-клиентом, для осуществления вызова слу­жит интерфейс основного класса remote. Каждый бизнес-метод, описан­ный в основном классе, должен иметь близнеца в интерфейсе remote.
4. Содержать хотя бы один метод ejbCreate(), с помощью которого со-
здается экземпляр в контейнере. Также должен быть описан метод ejb­PostCreate() точно с такими же параметрами, как и метод ejbCreate(). Для каждого метода создания экземпляра ejbCreate() обязательно дол­жен существовать метод-близнец ejbPostCreate(). Каждый метод созда­ния ejbCreate() и ejbPostCreate() должен иметь соответствующего близ­неца метод create() в home-интерфейсе Entity bean. Подобно бизнес-ме­тодам, методы создания не могут вызываться непосредственно из основного класса, для этого опять же используется интерфейс, только теперь это home. После успешного выполнения методов создания кон­тейнер создает EJBObject, а данные этого объекта помещаются в базу данных. Все методы создания описываются с уровнем доступа public, и они должны инициализировать CMP переменные, контейнер выделяет эти значения для дальнейшего помещения в источник данных. Методы создания не возвращают никаких значений, т. е. void. По необходимости каждый метод создания генерирует java.rmi.RemoteException и ja­vax.ejb.CeateException исключения.
Каждый основной класс Entity bean должен переопределять методы
интерфейса EntityBean.
Часть 4. Распределенные компненты EJB 235
import java.rmi.*;import javax.ejb.*; public class MyFirstEntityBean implements EntityBean { public void ejbActivate() throws RemoteException {} public void ejbCreate() throws CreateException, RemoteException {} public void ejbPostCreate()CreateException, RemoteException {} public void ejbCreate(int id, String name) throws CreateException, RemoteEx­ception {} public void ejbPostCreate(int id, String name)CreateException, RemoteExcep­tion {} public void ejbLoad() throws RemoteException {} public void ejbPassivate() throws RemoteException {} public void ejbRemove() throws RemoteException, RemoveException {} public void ejbStore() throws RemoteException {} public void setEntityContext(EntityContext arg1) throws RemoteException {} public void unsetEntityContext() throws RemoteException {}}
Пример, иллюстрирующий использование методов создания, благо-
даря методу create() создается экземпляр Entity bean без параметров, строка 4. В строке 6 указывается метод с аргументами int id, String na­me, используя который контейнер создаст экземпляр с двумя парамет­рами. Нельзя забывать о дублерах — строки 5, 7.
Создание home-интерфейса
Home-интерфейс описывает методы, используемые клиентом для со-
здания нового экземпляра Entity bean, нахождения или удаления суще­ствующего экземпляра из контейнера. Также home-интерфейс содер­жит методы получения метаданных о Entity bean. Каждый home-интер­фейс должен расширяться îò интерфейса javax.ejb.EJBHome. В создаваемом home-интерфейсе должны быть описаны методы crea­te(), точно с такими же аргументами, какими обладают методы ejbCrea­te() в основном классе. Методов create() в home-интерфейсе должно быть ровно столько, сколько соответствующих методов в основном клас­се. Методы create() home имеют дублеров — методы find(), предназна­ченные для поиска экземпляра. Методы find() имеют те же аргументы, что и методы create(). Данный интерфейс содержит ряд методов:
public intrface MyFirstEntityBeanHome extends javax.ejb.EJBHome { public MyFirstEntity create()throws CreateException, RemoteException {} public MyFirstEntity create(int id, String name) throws CreateException, Re­moteException {} public MyFirstEntity findByPrimaryKey() {} public javax.ejb. EJBMetaData getEJBMetaData() throws java.rmi.RemoteEx­ception {return null;} public void remove(Object arg1) throws java.rmi.RemoteException, javax.ejb. RemoveException {} public void remove(javax.ejb.Handle arg1) throws java.rmi.RemoteException, javax.ejb. RemoveException {}}
236 Часть 4. Распределенные компненты EJB
Строки 2, 3 совпадают со строками 4, 6 примера, приведенного выше.
В строке 1 указывается родительский интерфейс и то, что создаваемый объект является home-интерфейсом.
Метод create() должен именоваться только create и иметь идентич-
ные аргументы, количество и тип аргументов, описанных в методах со­здания ejbCreate() основного класса. Значение, возвращаемое методом create(), должно быть типом remote-интерфейса. По необходимости каждый метод создания генерирует java.rmi.RemoteException и ja­vax.ejb.CeateException исключения.
Метод find() используется для поиска существующего экземпляра
Entity bean, одного или нескольких. Метод обязательно должен начина­ться с ключевого слова find с дальнейшим описанием искомого элемен­та. Метод findByPrimaryKey() организует поиск по первичному ключу. Каждый home-интерфейс должен содержать минимум один метод find­ByPrimaryKey(), всегда иметь один аргумент класса Primary Key, одно­го из основных классов Entity bean. Возвращаемое значение этого клас­са соответствует типу remote-интерфейса. Каждый другой метод findXXX() должен отвечать следующим требованиям: должен возвра­щать тип remote-интерфейса или коллекцию java.util.Enumeration, ког­да возвращается более чем один объект. В случае необходимости дол­жен вызывать исключения java.rmi.RemoteException, и javax.ejb.Finder­Exception. Ничто не запрещает разработчику создать собственные методы findXXX(). Каждый EJB-контейнер использует собственный ме­ханизм использования метода findByPrimaryKey() для поиска данных. Однако каждый пользовательский метод findXXX() использует логику, описанную разработчиком.
Методы, наследуемые из интерфейса javax.ejb.EJBHome:
1. Метод remove() удаляет EJB-объект, идентифицированный обра-
ботчиком.
2. Еще один метод remove (java.lang.Object primaryKey) удаляет объ-
ект с указанным первичных ключом (primary key), используется только в Entity bean.
3. Для получения клиентом метаданных об Enterprise bean использу-
ется метод getEJBMetaData ().
4. Метод getHomeHandle() возвращает значение обработчика, работа-
ющего с объектом.
Создание remote-интерфейса
Интерфейс remote предназначен для организации доступа клиента к
бизнес-методам основного класса Entity bean. В этом интерфейсе опи­сываются также методы для удаления экземпляра объекта, управления и работы с объектом primary key. Имя remote должно совпадать с име­нем основного класса. Родителем данного интерфейса является ja­vax.ejb.EJBObjects. Для каждого бизнес-метода основного класса в re­mote-интерфейсе разработчиком описываются дублеры. Каждый метод должен генерировать исключительную ситуацию java.rmi.RemoteExcep­tion.
Часть 4. Распределенные компненты EJB 237
public interface MyFirstEntity extends javax.ejb.EJBObject { public javax.ejb.EJBHome getEJBHome() throws java.rmi.RemoteException {return null;} public javax.ejb.Handle getHandle() throws java.rmi.RemoteException {return null;} public Object getPrimaryKey() throws java.rmi.RemoteException {return null;} public boolean isIdentical(javax.ejb.EJBObject arg1) throws java.rmi.Remote­Exception {return false;} public void remove() throws java.rmi.RemoteException, javax.ejb. RemoveEx­ception {} . // Бизнес методы }
Методы, наследуемые remote-интерфейсом из родительского интер-
фейса:
1. С помощью метода getEJBHome() можно получить объект home-
интерфейса.
2. Метод getPrimaryKey() предназначен для получения первичного
ключа enterprise иуфт.
3. Удаление Enterprise bean обеспечивается методом remove().
4. Получить обработчик EJB можно используя метод getHandle().
5. Логическое значение метода isIdentical() указывает, идентичен ли
данный объект вызываемому EJB.
Создание класса первичного ключа (primary key)
В контейнере каждый Enterprise bean имеет уникальный идентифи-
кационный номер. Если идентификационные номера двух различных bean совпадают, то эти Enterprise bean идентичны. Класс первичного ключа именуется как основной класс добавлением в конце имени клю­чевого слова key. Класс используется для создания управления первич­ным ключом. Первичным ключом называется колонка в таблице базы данных, не имеющая ни одного дублированного элемента. Класс первич­ного ключа должен быть публичным и серилизованным. Переменные класса должны иметь уровень доступа public, переменные должны име­новаться так же, как переменные в основном классе. Как минимум дан­ный класс должен иметь хотя бы один конструктор.
Создание класса primary key
Класс primary key содержит методы по определению первичного
ключа EJB-объекта. В спецификации указывается, что имя класса pri­mary key должно содержать два элемента: NameKey — основное имя Enterprise bean и постфикс Key. Кроме того, существуют и другие тре­бования, выполнение которых обязательно при создании класса primary key. Класс должен иметь уровень доступа public и быть сериализован­ным объектом. В теле класса должен содержаться хотя бы один конст­руктор.
238 Часть 4. Распределенные компненты EJB
import java. io.*; public class AccountKey implements Serializable { public AccountKey(){}; // какой-либо код}
33.2. Разработка EJB с помощью BMP
В отличие от CMP (Container Managed Persistence), использующего
значения контейнера по умолчанию при работе с EJB, Bean Managed Persistence (BMP) предназначен для полной передачи пользователю функции по работе с EJB. BMP очень полезен при необходимости испо­льзования других источников информации.
В случае использования способа создания EJB при помощи BMP, en-
tity должны содержать все методы, описывающие взаимодействие меж­ду Entity bean и источником данных. Enterprise bean, разрабатываемые при помощи BMP, должны содержать весь код, обеспечивающий взаи­модействие между EJB и источником данных. Использование BMP оправдано в следующих случаях:
1. Если постоянные данные хранятся больше, чем в одной базе дан-
íûõ.
2. Если постоянные данные хранятся в источнике, не поддерживае-
мом EJB-сервером.
3. Если постоянные данные требуется синхронизировать для различ-
ных источников.
Практически создание EJB с помощью BMP идентично созданию
EJB с помощью CMP. Сам создаваемый Enterprise bean содержит те же классы и методы, но реализация компонентов происходит по другому сценарию. Любой Entity bean, созданный с помощью BMP, имеет со­зданный разработчиком класс primary key class или может использова­ться существующий класс. Основной класс Entity bean, содержащий как бизнес-методы, так и методы управления жизненным циклом bean, определятся разработчиком. На каждом этапе жизненного цикла, раз­работчик имеет полное право добавлять необходимые приложению до­полнительные методы и переменные. Как и основной класс, bean, разра­ботанный с помощью CMP, bean разрабатываемый при помощи BMP, имеет имя NameBean, где параметр Name указывает имя enterprise be­an. Все требования, предъявляемые при создании enterprise bean в CMP, также должны соблюдаться и в BMP. Кроме основных методов, должен описываться код получения соединения и взаимодействия с ис­точником данных. Создается добавочный метод ejbFindByPrimaryKey(). Поскольку предполагается использовать другой источник данных, мно­жество операторов импорта расширяется для включения пакета ja­va.sql.*; предназначенного для работы с базами данных. Данные также могут быть двух типов: временные, не хранящиеся в базе данных, и по­стоянные, содержимое базы данных, но отличие соcтоит в том, что по­стоянные переменные могут иметь уровень доступа private. Временные переменные не используются в транзакциях, и EJB-клиент может из­менять их по своему усмотрению. Они могут быть потеряны при поме-
Часть 4. Распределенные компненты EJB 239
щении Entity bean в пул, когда контейнер вызывает ejbPassive(). Созда­ние метода ejbCreate() с помощью BMP требует других подходов. В основном в методе ejcCreate() используется код, необходимый для ра­боты с источником данных. Определяются драйверы доступа, описыва­ется интерфейс доступа, указывается имя базы данных и рабочая таб­лица. Кроме того, могут содержаться дополнительные методы и пере­менные по идентификации пользователя. Каждый метод ejbCreate(), а их может быть несколько, должен иметь уровень доступа public и воз­вращаемое значение класса primary key class. Далее, все аргументы должны соответствовать правилам использования r Java remote method invocation (RMI). В методе должны быть описаны средства обновления базы данных. Каждый ejbPostCreate() должен быть public и возвращать void, иметь те же аргументы и типы аргументов, как и метод ejbCrea­te(). По необходимости оба метода и ejbCreate() и ejbPostCreate(), долж­ны вызывать java.rmi.RemoteException и javax.ejb.CreateException иск­лючения, а также javax.ejb.DuplicateKeyException и пользовательские исключения.
Как минимум, должен быть описан хотя бы один метод ejbFindByPri-
maryKey(), содержащий уникальные значения для каждого Enterprise bean. Можно описать и ряд других поисковых методов findXXX (). Кон­тейнер вызывает метод find(), для поиска уже существующего Enterpri­se bean во временном пуле. Метод Find() содержит код для доступа к базе данных, используя JDBC- и SQL-запрос, выполняющий поиск. Также в теле метода описываются способы освобождения ресурсов. Ес­ли SQL-запрос вернул одну и только одну запись вместо таблицы, как обычно, метод возвращает значение первичного ключа. Если же в результате запроса получилась таблица, генерируется исключение Fin­derException. Прежде чем определять возвращаемое значение, метод обязательно должен освободить занятые ресурсы.
Основными методами по работе с источником данных являются мето-
ды ejbLoad() и ejbStore(). При создании Enterprise bean с помощью BMP именно эти методы необходимо перегрузить. Методы ejbLoad() и ejbSto­re() содержат код сохранения и считывания данных из системной базы данных. Другими словами, в методах описывается доступ к данным. Контейнер вызывает методы работы с базой данных в момент обраще­ния клиента для инициализации или по необходимости получения по­стоянных данных. Метод ejbLoad () обычно вызывается контейнером пе­ред началом транзакции и перед началом вызова бизнес-методов. В ме­тоде описываются способы получения данных, используя JDBC API. На настоящий момент, после принятия стандарта SQLJ, в методе можно использовать и способы, предоставляемые этой технологией.
1. import java.sql.Connection;
2. public class CustomerBean implements EntityBean {
3. public void ejbLoad() {
4. Connection con;
5. try {Integer primaryKey = (Integer)ejbContext.getPrimaryKey();
6. con = this.getConnection();
240 Часть 4. Распределенные компненты EJB
7. Statement sqlStmt = con.createStatement(«SELECT * FROM Customer» + «WHERE customerID=»+primaryKey.intValue());
8. ResultSet results = sqlStmt.executeQuery();
9. if (results. next()) {
10. String myName. first = results.getString(«FIRST_NAME»);
11. init myID = results.getInt(«ID»); } }
12. catch (SQLException sqle) {
13. throw new EJBException(sqle); }
14. finally { if (con!=null) con.close(); }
Данный пример иллюстрирует только способ использования BMP
при создании Enterprise bean. Первая строка определяет необходимый пакет, если его предполагается использовать в приложении JDBC. Для использования SQLJ потребуются другие операторы импорта. Здесь опущены все остальные методы, реализуемые интерфейсом EntityBean. В 3-й строке начинается сам метод ejbLoad(). Здесь также опущены методы вызова драйвера базы данных и не указана сама база данных. В 5-й строке создается переменная primaryKey, которой присваивается значение первичного ключа Enterprise bean. В 7-й строке переменой sqlStmp присваивается значение запроса. Далее временным полям при­сваиваются значения результата запроса.
Другой метод по работе с базой данных ejbStore() вызывается кон-
тейнером в конце транзакции. Как и в предыдущем примере, здесь опи­сывается только тело метода ejbStore(), без дополнительных парамет­ров и методов.
1. import java.sql.Connection;
2. public class CustomerBean implements EntityBean {
3. public void ejbStore() {
4. Connection con;
5. try {
6. Integer primaryKey = (Integer)ejbContext.getPrimaryKey();
7. con = this.getConnection();
8. PreparedStatement sqlPrep =
9. con.prepareStatement(«UPDATE customer set» + first_name = ?, «WHERE id = ?»);
10. sqlPrep.setString(2, myName.first);
11. sqlPrep.setInt(7, myID.Id);
12. sqlPrep.executeUpdate(); }
13. catch (SQLException sqle) {
14. throw new EJBException(sqle); }
15. finally { if (con!=null) con.close();}
За некоторыми маленькими исключениями, приведенный пример по-
добен первому примеру, описывающему метод ejbLoad (). Только здесь вместо операции считывания данных используется операция их обнов-