······
····
··
В листинге 8.11 в BookEJB внедряется ссылка на объект типа EntityManager, связанный с блоком хранения chapter08PU. Этот блок хранения (заданный в листинге 8.14) должен определить имя источника данных, к которому следует подключиться (jdbc/chapter08DS), не указывая при этом никакие свойства доступа (URL, JDBC-драйвер и т. д.).
Написание DatabasePopulator и определение источника данных
Источник данных jdbc/chapter08DS, необходимый для блока хранения, должен быть создан внутри контейнера EJB. Существует несколько способов сделать это. Самый простой — аннотировать с помощью @DataSourceDefinition любой управляемый компонент (листинг 8.15). Контейнер развернет компонент и создаст источник данных. Другой способ состоит в использовании интерфейса GlassFish, что вы увидите дальше.
@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