Упаковка и развертывание объектов

Развертывание entity-объекта требует некоторое количество дополнительной информации, в дополнении к той, что требуется для session-объекта. Эта информация должна быть описана в дескрипторе развертывания ejb-jar.xml

<?xml version="1.0"?>

<ejb-jar>
  <display-name>MusicCDs</display-name>
  <enterprise-beans>

    <entity>
      <description>Models a music CD</description>
      <ejb-name>CDBean</ejb-name>
      <home>org.jboss.docs.cmp.cd.interfaces.CDHome</home>
      <remote>org.jboss.docs.cmp.cd.interfaces.CD</remote>
      <ejb-class>org.jboss.docs.cmp.cd.bean.CDBean</ejb-class>
      <persistence-type>Container</persistence-type>
      <prim-key-class>java.lang.Integer</prim-key-class>
      <reentrant>False</reentrant>
      <cmp-field><field-name>id</field-name></cmp-field>
      <cmp-field><field-name>title</field-name></cmp-field>
      <cmp-field><field-name>artist</field-name></cmp-field>
      <cmp-field><field-name>type</field-name></cmp-field>
      <cmp-field><field-name>notes</field-name></cmp-field>
      <primkey-field>id</primkey-field>
    </entity>

    <session>
      <description>Models a music CD collection</description>
      <ejb-name>CDCollectionBean</ejb-name>
      <home>org.jboss.docs.cmp.cd.interfaces.CDCollectionHome</home>
      <remote>org.jboss.docs.cmp.cd.interfaces.CDCollection</remote>
      <ejb-class>org.jboss.docs.cmp.cd.bean.CDCollectionBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
	  <ejb-ref>
         <ejb-ref-name>ejb/CD</ejb-ref-name>
         <ejb-ref-type>Entity</ejb-ref-type>
         <home>org.jboss.docs.cmp.cd.interfaces.CDHome</home>
         <remote>org.jboss.docs.cmp.cd.interfaces.CD</remote>
         <ejb-link>CDBean</ejb-link>
	  </ejb-ref>
    </session>

  </enterprise-beans>

  <assembly-descriptor>
    <container-transaction>
      <method>
        <ejb-name>CDBean</ejb-name>
        <method-name>*</method-name>
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
  </assembly-descriptor>
</ejb-jar>

Первая часть приведенного листинга показывет раздел файла ejb-jar.xml, который относится к объекту CD Bean. В нем указана обычная информация о классах, которые составляют объект, кроме этого в этом файле определяются тип и наименование первичного ключа и перечень сохраняемых полей. Заметим, что в этом случае поле "id" перечислено дважды: один раз в качестве сохраняемого поля (persistent field) и еще раз в качестве поля первичного ключа. Можно было бы предположить, что первичный ключ должен был быть автоматически сохраняемым, но это не так.

Вторая часть листинга описывает CDCollection session-объект. Для него не требуется никакой информации о сохранении состояния, но в нем должна присутствовать секция ejb-ref; в ней отражено, что объект CDCollection связан с объектом CD. Секция ejb-ref перечисляет тип объекта CD и все его классы.

В конфигурационном файле "jboss.xml" для JBoss мы должны определить JNDI-имена этих объектов:

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

<jboss>
    <secure>false</secure>
    <container-configurations />
    <resource-managers />
    <enterprise-beans>
        <session>
	    <ejb-name>CDCollectionBean</ejb-name>
	    <jndi-name>cd/CDCollection</jndi-name>
	    <configuration-name></configuration-name>
        </session>
        <entity>
	    <ejb-name>CDBean</ejb-name>
	    <jndi-name>cd/CD</jndi-name>
	    <configuration-name></configuration-name>
        </entity>
    </enterprise-beans>
</jboss>

В этом файле говорится о том, что объект "CDBean" имеет JNDI имя "cd/CD", а объект "CDCollectionBean" имеет JNDI имя "cd/CDCollection".

Чтобы скомпилировать и упаковать эти EJB объекты, выполните команду "ant cmp-cd-compile". Она скомпилирует исходные коды и создаст jar-файл, готовый для развёртывания.

Во время развёртывания (для этого просто скопируйте файл "documentation-example/build-examples/cmp-cd/ejb/cd.jar" в директорию "deploy" вашей инсталляции JBoss) вы дожны увидеть следующие сообщения:

[Default] JBoss 2.2.2 Started in 0m:5s
[Auto deploy] Auto deploy of file:/C:/Projects/jbosscvs22/jboss/dist/deploy/cd.jar
[J2EE Deployer Default] Deploy J2EE application: file:/C:/Projects/jbosscvs22/jboss/dist/deploy/cd.jar
[J2EE Deployer Default] Create application cd.jar
[J2EE Deployer Default] install module cd.jar
[Container factory] Deploying:file:/C:/Projects/jbosscvs22/jboss/dist/tmp/deploy/Default/cd.jar
[Verifier] Verifying file:/C:/Projects/jbosscvs22/jboss/dist/tmp/deploy/Default/cd.jar/ejb1001.jar
[Container factory] Deploying CDBean
[Container factory] Deploying CDCollectionBean
[JAWS] Created table 'CDBean' successfully.
[Bean Cache] Cache policy scheduler started
[Container factory] Deployed application: file:/C:/Projects/jbosscvs22/jboss/dist/tmp/deploy/Default/cd.jar
[J2EE Deployer Default] J2EE application: file:/C:/Projects/jbosscvs22/jboss/dist/deploy/cd.jar is deployed.

"JAWS" это интерфейс JBoss с базой данных. Во время развёртывания JAWS удалил любую существующую таблицу с именем "CDBean", после этого была создана новая таблица CDBean с необходимыми колонками. Откуда JAWS знает, что надо использовать VARCHAR(256) для каждого поля? Он не знает: он предполагает, потому что мы не предоставили никакой информации об этом. В течении развертывания, JAWS ищет файл с именем "jaws.xml"; если этот файл существует, то из него считывается информация об именах и геометрии таблиц базы данных. VARCHAR(256) это тип по умолчанию для атрибутов с типом String. Имена таблиц по умолчанию присваиваются в соответствии с именем объекта, вот почему была создана таблица с именем "CDBean". Имя таблицы может быть переопределено в файле jaws.xml. На практике, настройки по умолчанию для JAWS подходят на время разработки. Однако, может быть улучшение производительности при использовании полей с фиксированной длинной (например, CHAR(XX)), вместо полей с изменяемой длинной, в случае если такое изменение возможно в приложении.

Заметьте, что иногда бывает очень сложно изменить количество и наименования колонок в таблице, когда в ней уже есть данные. JBoss будет озадачен этим. Когда CMP-объект переразвёрнут (re-deployed), JAWS пытается записать в его таблицу все данные которые он получил в результате предыдущего развёртывания. Если таблица имеет другой набор колонок, то, скорее всего, он не сможет это сделать. Это означает, что очень важно правильно назвать все сохраняемые поля перед тем как начинать размещать в приложении реальные данные.

Наши друзья