······

····

··

В листинге 8.11 в BookEJB внедряется ссылка на объект типа EntityManager, связанный с блоком хранения chapter08PU. Этот блок хранения (заданный в листинге 8.14) должен определить имя источника данных, к которому следует подключиться (jdbc/chapter08DS), не указывая при этом никакие свойства доступа (URL, JDBC-драйвер и т. д.).

<p>Написание DatabasePopulator и определение источника данных</p>

Источник данных jdbc/chapter08DS, необходимый для блока хранения, должен быть создан внутри контейнера EJB. Существует несколько способов сделать это. Самый простой — аннотировать с помощью @DataSourceDefinition любой управляемый компонент (листинг 8.15). Контейнер развернет компонент и создаст источник данных. Другой способ состоит в использовании интерфейса GlassFish, что вы увидите дальше.

Листинг 8.15. Синглтон, развертывающий источник данных и инициализирующий базу данных при запуске

@Singleton

@Startup

@DataSourceDefinition(

··className = "org.apache.derby.jdbc.EmbeddedDataSource",

··name = "java: global/jdbc/chapter08DS",

··user = "app",

··password = "app",

··databaseName = "chapter08DB",

··properties = {"connectionAttributes=;create=true"}

)

public class DatabasePopulator {

··@Inject

··private BookEJB bookEJB;

··private Book h2g2;

··private Book lord;

··@PostConstruct

··private void populateDB() {

····h2g2 = new Book("Изучаем Java EE 7", 35F, "Великая книга", 

"1-8763-9125-7", 605, true);

····lord = new Book("Властелин колец", 50.4f, "Фэнтези", "1-84023-742-2", 

1216, true);

····bookEJB.createBook(h2g2);

····bookEJB.createBook(lord);

··}

··@PreDestroy

··private void clearDB() {

····bookEJB.deleteBook(h2g2);

····bookEJB.deleteBook(lord);

··}

}

Синглтон DatabasePopulator (см. листинг 8.15) используется для инициализации некоторых данных при запуске (@Startup). Во время развертывания контейнер инициализирует синглтон и запустит метод populateDB(), поскольку тот имеет аннотацию @PostConstruct. Этот метод использует BookEJB для создания нескольких книг в базе данных. При выключении контейнер вызовет метод clearDB() (имеющий аннотацию @PostConstruct) для удаления книг из базы данных.

Вместо того чтобы использовать аннотацию @DataSourceDefinition для создания источника данных во время развертывания, вы также можете создать его с помощью консоли администрирования GlassFish или из командной строки. Использование командной строки — очень быстрый и легкий способ. Лишь убедитесь, что Derby и GlassFish запущены до введения следующих команд.

Примечание

@DataSourceDefinition определяет источник данных и, как вы увидите в главе 13 (листинг 13.18), JMS 2.0 использует тот же механизм для определения ресурсов (ConnextionFactory и Destination) благодаря аннотациям @JMSConnectionFactoryDefinition и @JMSDestinationDefinition.

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

$ asadmin create-jdbc-connection-pool 

··—datasourceclassname=org.apache.derby.jdbc.ClientDataSource 

··—restype=javax.sql.DataSource 

··—property portNumber=1527:password=APP: user=APP: serverName=localhost: 

··databaseName=chapter08DB: connectionAttributes=;create\=true Chapter08Pool

Перейти на страницу:

Похожие книги