В EJB 3.0 механизм персистентности используется для доступа к базе данных, в которой контейнер управляет операциями, связанными с базой данных. Разработчики могут обращаться к базе данных с помощью вызова API JDBC напрямую в бизнес-методах EJB.
Чтобы продемонстрировать доступ к базе данных в EJB, нам нужно выполнить следующие задачи:
-
Шаг 1 — Создать таблицу в базе данных.
-
Шаг 2 — Создайте EJB без состояния, имеющий дело со мной.
-
Шаг 3 — Обновите EJB без сохранения состояния. Добавьте методы для добавления записей и получения записей из базы данных через менеджер сущностей.
-
Шаг 4 — Клиент консольного приложения получит доступ к EJB без сохранения состояния для сохранения данных в базе данных.
Шаг 1 — Создать таблицу в базе данных.
Шаг 2 — Создайте EJB без состояния, имеющий дело со мной.
Шаг 3 — Обновите EJB без сохранения состояния. Добавьте методы для добавления записей и получения записей из базы данных через менеджер сущностей.
Шаг 4 — Клиент консольного приложения получит доступ к EJB без сохранения состояния для сохранения данных в базе данных.
Создать таблицу
Создать таблицу книг по умолчанию в базе данных postgres .
CREATE TABLE books ( id integer PRIMARY KEY, name varchar(50) );
Создать модельный класс
public class Book implements Serializable{ private int id; private String name; public Book() { } public int getId() { return id; } ... }
Создать EJB без состояния
@Stateless public class LibraryPersistentBean implements LibraryPersistentBeanRemote { public void addBook(Book book) { //persist book using jdbc calls } public List<Book> getBooks() { //get books using jdbc calls } ... }
После создания модуля EJB нам нужен клиент для доступа к bean-компоненту без сохранения состояния, который мы собираемся создать в следующем разделе.
Пример приложения
Давайте создадим тестовое приложение EJB для проверки механизма доступа к базе данных EJB.
шаг | Описание |
---|---|
1 |
Создайте проект с именем EjbComponent в пакете com.tutorialspoint.entity, как описано в главе EJB — Создание приложения . Вы также можете использовать проект, созданный в главе EJB — Создание приложения как таковой, для понимания концепций доступа к данным EJB. |
2 |
Создайте Book.java в пакете com.tutorialspoint.entity и измените его, как показано ниже. |
3 |
Создайте LibraryPersistentBean.java и LibraryPersistentBeanRemote, как описано в главе EJB — Создание приложения, и измените их, как показано ниже. |
4 |
Очистите и создайте приложение, чтобы убедиться, что бизнес-логика работает в соответствии с требованиями. |
5 |
Наконец, разверните приложение в виде файла JAR на сервере приложений JBoss. Сервер приложений JBoss запустится автоматически, если он еще не запущен. |
6 |
Теперь создайте EJB-клиент, консольное приложение, аналогично тому, как описано в главе EJB — Создание приложения в разделе « Создание клиента для доступа к EJB» . Измените его, как показано ниже. |
Создайте проект с именем EjbComponent в пакете com.tutorialspoint.entity, как описано в главе EJB — Создание приложения . Вы также можете использовать проект, созданный в главе EJB — Создание приложения как таковой, для понимания концепций доступа к данным EJB.
Создайте Book.java в пакете com.tutorialspoint.entity и измените его, как показано ниже.
Создайте LibraryPersistentBean.java и LibraryPersistentBeanRemote, как описано в главе EJB — Создание приложения, и измените их, как показано ниже.
Очистите и создайте приложение, чтобы убедиться, что бизнес-логика работает в соответствии с требованиями.
Наконец, разверните приложение в виде файла JAR на сервере приложений JBoss. Сервер приложений JBoss запустится автоматически, если он еще не запущен.
Теперь создайте EJB-клиент, консольное приложение, аналогично тому, как описано в главе EJB — Создание приложения в разделе « Создание клиента для доступа к EJB» . Измените его, как показано ниже.
EJBComponent (модуль EJB)
Book.java
package com.tutorialspoint.entity; import java.io.Serializable; public class Book implements Serializable{ private int id; private String name; public Book() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
LibraryPersistentBeanRemote.java
package com.tutorialspoint.stateless; import com.tutorialspoint.entity.Book; import java.util.List; import javax.ejb.Remote; @Remote public interface LibraryPersistentBeanRemote { void addBook(Book bookName); List<Book> getBooks(); }
LibraryPersistentBean.java
package com.tutorialspoint.stateless; import com.tutorialspoint.entity.Book; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import javax.ejb.Stateless; @Stateless public class LibraryPersistentBean implements LibraryPersistentBeanRemote { public LibraryPersistentBean() { } public void addBook(Book book) { Connection con = null; String url = "jdbc:postgresql://localhost:5432/postgres"; String driver = "org.postgresql.driver"; String userName = "sa"; String password = "sa"; List<Book> books = new ArrayList<Book>(); try { Class.forName(driver).newInstance(); con = DriverManager.getConnection(url , userName, password); PreparedStatement st = con.prepareStatement("insert into book(name) values(?)"); st.setString(1,book.getName()); int result = st.executeUpdate(); } catch (SQLException ex) { ex.printStackTrace(); } catch (InstantiationException ex) { ex.printStackTrace(); } catch (IllegalAccessException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } } public List<Book> getBooks() { Connection con = null; String url = "jdbc:postgresql://localhost:5432/postgres"; String driver = "org.postgresql.driver"; String userName = "sa"; String password = "sa"; List<Book> books = new ArrayList<Book>(); try { Class.forName(driver).newInstance(); con = DriverManager.getConnection(url , userName, password); Statement st = con.createStatement(); ResultSet rs = st.executeQuery("select * from book"); Book book; while (rs.next()) { book = new Book(); book.setId(rs.getInt(1)); book.setName(rs.getString(2)); books.add(book); } } catch (SQLException ex) { ex.printStackTrace(); } catch (InstantiationException ex) { ex.printStackTrace(); } catch (IllegalAccessException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } return books; } }
-
Как только вы развернете проект EjbComponent в JBOSS, обратите внимание на журнал jboss.
-
JBoss автоматически создал запись JNDI для нашего сессионного компонента — LibraryPersistentBean / remote .
-
Мы будем использовать эту строку поиска для получения удаленного бизнес-объекта типа — com.tutorialspoint.stateless.LibraryPersistentBeanRemote
Как только вы развернете проект EjbComponent в JBOSS, обратите внимание на журнал jboss.
JBoss автоматически создал запись JNDI для нашего сессионного компонента — LibraryPersistentBean / remote .
Мы будем использовать эту строку поиска для получения удаленного бизнес-объекта типа — com.tutorialspoint.stateless.LibraryPersistentBeanRemote
Вывод журнала сервера приложений JBoss
... 16:30:01,401 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI: LibraryPersistentBean/remote - EJB3.x Default Remote Business Interface LibraryPersistentBean/remote-com.tutorialspoint.stateless.LibraryPersistentBeanRemote - EJB3.x Remote Business Interface 16:30:02,723 INFO [SessionSpecContainer] Starting jboss.j2ee:jar=EjbComponent.jar,name=LibraryPersistentBeanRemote,service=EJB3 16:30:02,723 INFO [EJBContainer] STARTED EJB: com.tutorialspoint.stateless.LibraryPersistentBeanRemote ejbName: LibraryPersistentBean 16:30:02,731 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI: LibraryPersistentBean/remote - EJB3.x Default Remote Business Interface LibraryPersistentBean/remote-com.tutorialspoint.stateless.LibraryPersistentBeanRemote - EJB3.x Remote Business Interface ...
EJBTester (клиент EJB)
jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=localhost
-
Эти свойства используются для инициализации объекта InitialContext сервиса именования java.
-
Объект InitialContext будет использоваться для поиска сессионного компонента без сохранения состояния.
Эти свойства используются для инициализации объекта InitialContext сервиса именования java.
Объект InitialContext будет использоваться для поиска сессионного компонента без сохранения состояния.
EJBTester.java
package com.tutorialspoint.test; import com.tutorialspoint.stateless.LibraryPersistentBeanRemote; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import java.util.Properties; import javax.naming.InitialContext; import javax.naming.NamingException; public class EJBTester { BufferedReader brConsoleReader = null; Properties props; InitialContext ctx; { props = new Properties(); try { props.load(new FileInputStream("jndi.properties")); } catch (IOException ex) { ex.printStackTrace(); } try { ctx = new InitialContext(props); } catch (NamingException ex) { ex.printStackTrace(); } brConsoleReader = new BufferedReader(new InputStreamReader(System.in)); } public static void main(String[] args) { EJBTester ejbTester = new EJBTester(); ejbTester.testEntityEjb(); } private void showGUI() { System.out.println("**********************"); System.out.println("Welcome to Book Store"); System.out.println("**********************"); System.out.print("Options \n1. Add Book\n2. Exit \nEnter Choice: "); } private void testEntityEjb() { try { int choice = 1; LibraryPersistentBeanRemote libraryBean = LibraryPersistentBeanRemote) ctx.lookup("LibraryPersistentBean/remote"); while (choice != 2) { String bookName; showGUI(); String strChoice = brConsoleReader.readLine(); choice = Integer.parseInt(strChoice); if (choice == 1) { System.out.print("Enter book name: "); bookName = brConsoleReader.readLine(); Book book = new Book(); book.setName(bookName); libraryBean.addBook(book); } else if (choice == 2) { break; } } List<Book> booksList = libraryBean.getBooks(); System.out.println("Book(s) entered so far: " + booksList.size()); int i = 0; for (Book book:booksList) { System.out.println((i+1)+". " + book.getName()); i++; } } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); }finally { try { if(brConsoleReader !=null) { brConsoleReader.close(); } } catch (IOException ex) { System.out.println(ex.getMessage()); } } } }
EJBTester выполняет следующие задачи —
-
Загрузите свойства из jndi.properties и инициализируйте объект InitialContext.
-
В методе testStatefulEjb () поиск jndi выполняется с именем «LibraryStatelessSessionBean / remote» для получения удаленного бизнес-объекта (EJB с состоянием).
-
Затем пользователю показывается пользовательский интерфейс магазина библиотеки, и ему / ей предлагается ввести выбор.
-
Если пользователь вводит 1, система запрашивает имя книги и сохраняет книгу, используя метод addBook () сессионного компонента без сохранения состояния. Сессионный компонент сохраняет книгу в базе данных с помощью вызова EntityManager.
-
Если пользователь вводит 2, система получает книги с использованием метода getBooks () сессионного компонента без сохранения состояния и завершает работу.
-
Затем выполняется другой поиск jndi с именем — «LibraryStatelessSessionBean / remote», чтобы снова получить удаленный бизнес-объект (с состоянием EJB) и составить список книг.
Загрузите свойства из jndi.properties и инициализируйте объект InitialContext.
В методе testStatefulEjb () поиск jndi выполняется с именем «LibraryStatelessSessionBean / remote» для получения удаленного бизнес-объекта (EJB с состоянием).
Затем пользователю показывается пользовательский интерфейс магазина библиотеки, и ему / ей предлагается ввести выбор.
Если пользователь вводит 1, система запрашивает имя книги и сохраняет книгу, используя метод addBook () сессионного компонента без сохранения состояния. Сессионный компонент сохраняет книгу в базе данных с помощью вызова EntityManager.
Если пользователь вводит 2, система получает книги с использованием метода getBooks () сессионного компонента без сохранения состояния и завершает работу.
Затем выполняется другой поиск jndi с именем — «LibraryStatelessSessionBean / remote», чтобы снова получить удаленный бизнес-объект (с состоянием EJB) и составить список книг.
Запустите клиент для доступа к EJB
Найдите EJBTester.java в проводнике проекта. Щелкните правой кнопкой мыши класс EJBTester и выберите файл запуска .
Проверьте следующий вывод в консоли Netbeans.