Maven с JPA, на WildFly
Давайте создадим простой проект на Maven с использованием JPA, который будет развернут на WildFly. Мы создадим приложение, которое будет управлять сущностью User
. Вот шаги, которые мы пройдем:
- Создание структуры проекта Maven
- Настройка
pom.xml
- Создание сущности JPA
- Создание DAO (Data Access Object)
- Создание сервлета для взаимодействия с пользователем
- Настройка WildFly для работы с JPA
- Развертывание и тестирование приложения
1. Создание структуры проекта Maven
Создайте новый проект Maven с помощью следующей структуры:
my-jpa-app
│
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ ├── entity
│ │ │ │ └── User.java
│ │ │ ├── dao
│ │ │ │ └── UserDao.java
│ │ │ └── servlet
│ │ │ └── UserServlet.java
│ │ └── resources
│ │ └── META-INF
│ │ └── persistence.xml
│ └── webapp
│ └── WEB-INF
│ └── web.xml
2. Настройка pom.xml
Создайте файл pom.xml
с необходимыми зависимостями:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-jpa-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<!-- Jakarta Persistence API -->
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>3.0.0</version>
</dependency>
<!-- Hibernate as JPA provider -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.0.Final</version> <!-- Обновите до версии, совместимой с Jakarta -->
</dependency>
<!-- JDBC Driver for your database (e.g., H2) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>runtime</scope>
</dependency>
<!-- Jakarta Servlet API -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
</plugins>
</build>
</project>
3. Создание сущности JPA
Создайте класс User
в пакете com.example.entity
:
Извините за неполный ответ! Давайте я предоставлю полный код класса User
, который будет представлять сущность JPA в вашем проекте.
Полный код класса User
Создайте класс User
в пакете com.example.entity
:
package com.example.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // Уникальный идентификатор пользователя
private String name; // Имя пользователя
private String email; // Email пользователя
// Конструктор по умолчанию
public User() {
}
// Геттеры и сеттеры
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
'}';
}
}
Объяснение кода
- Аннотация
@Entity
: Указывает, что этот класс является сущностью JPA и будет отображаться на таблицу в базе данных. - Поле
id
: Это уникальный идентификатор для каждого пользователя. Он помечен аннотацией@Id
, что указывает, что это первичный ключ, и@GeneratedValue
, что означает, что значение будет автоматически генерироваться базой данных. - Поля
name
иemail
: Это обычные поля, которые будут хранить имя и адрес электронной почты пользователя. - Конструктор по умолчанию: JPA требует наличие конструктора без параметров для создания экземпляров сущности.
- Геттеры и сеттеры: Методы для доступа и изменения значений полей.
Конечно! Давайте продолжим с создания DAO, сервлета и настройки WildFly.
4. Создание DAO (Data Access Object)
Создайте класс UserDao
в пакете com.example.dao
:
package com.example.dao;
import com.example.entity.User;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import java.util.List;
public class UserDao {
private EntityManagerFactory entityManagerFactory;
public UserDao() {
this.entityManagerFactory = Persistence.createEntityManagerFactory("my-persistence-unit");
}
public void saveUser(User user) {
EntityManager entityManager = entityManagerFactory.createEntityManager();
try {
entityManager.getTransaction().begin();
entityManager.persist(user);
entityManager.getTransaction().commit();
} catch (Exception e) {
if (entityManager.getTransaction().isActive()) {
entityManager.getTransaction().rollback();
}
e.printStackTrace(); // Выводим стек вызовов для отладки
} finally {
entityManager.close();
}
}
public User getUser(Long id) {
EntityManager entityManager = entityManagerFactory.createEntityManager();
User user = entityManager.find(User.class, id);
entityManager.close();
return user;
}
public List<User> getAllUsers() {
EntityManager entityManager = entityManagerFactory.createEntityManager();
List<User> users = entityManager.createQuery("SELECT u FROM User u", User.class).getResultList();
entityManager.close();
return users;
}
}
5. Создание сервлета для взаимодействия с пользователем
Создайте класс UserServlet
в пакете com.example.servlet
:
package com.example.servlet;
import com.example.dao.UserDao;
import com.example.entity.User;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/users")
public class UserServlet extends HttpServlet {
private UserDao userDao;
@Override
public void init() throws ServletException {
userDao = new UserDao();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<User> users = userDao.getAllUsers();
request.setAttribute("users", users);
request.getRequestDispatcher("/WEB-INF/users.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String email = request.getParameter("email");
User user = new User();
user.setName(name);
user.setEmail(email);
userDao.saveUser(user);
response.sendRedirect("users");
}
6. Создание JSP-страницы для отображения пользователей
Создайте файл users.jsp
в папке src/main/webapp/WEB-INF
:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://xmlns.jcp.org/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>Список пользователей</title>
</head>
<body>
<h1>Список пользователей</h1>
<table>
<tr>
<th>Имя</th>
<th>Email</th>
</tr>
<c:forEach var="user" items="${users}">
<tr>
<td>${user.name}</td>
<td>${user.email}</td>
</tr>
</c:forEach>
</table>
<c:set var="message" value="Привет, мир!" />
<c:if test="${not empty message}">
<p>${message}</p>
</c:if>
<!-- Форма для добавления пользователя -->
<form action="users" method="post">
<input type="text" name="name" placeholder="Имя" required>
<input type="email" name="email" placeholder="Email" required>
<button type="submit">Добавить пользователя</button>
</form>
</body>
</html>
7. Настройка persistence.xml
Создайте файл persistence.xml
в папке src/main/resources/META-INF
:
Конечно! Давайте завершим настройку persistence.xml
и создадим файл web.xml
для конфигурации сервлета.
Завершение настройки persistence.xml
Вот полный файл persistence.xml
, который мы начали:
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"
version="3.0">
<persistence-unit name="my-persistence-unit">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.example.entity.User</class>
<properties>
<property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="jakarta.persistence.jdbc.url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"/>
<property name="jakarta.persistence.jdbc.user" value="sa"/>
<property name="jakarta.persistence.jdbc.password" value=""/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
8. Создание web.xml
Создайте файл web.xml
в папке src/main/webapp/WEB-INF
:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.example.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/users</url-pattern>
</servlet-mapping>
</web-app>
9. Развертывание и тестирование приложения
Теперь, когда у нас есть вся необходимая структура и код, давайте развернем приложение на WildFly.
- Сборка проекта: Откройте терминал, перейдите в корневую папку вашего проекта и выполните команду:
bash
mvn clean package
Это создаст файл WAR в папке target
.
- Развертывание на WildFly:
- Скопируйте файл WAR из
target/my-jpa-app.war
в папкуstandalone/deployments
вашего WildFly. -
Убедитесь, что WildFly запущен. Вы можете запустить его с помощью команды:
bash ./standalone.sh
-
Доступ к приложению: Откройте веб-браузер и перейдите по адресу:
http://localhost:8080/my-jpa-app/users
Вы должны увидеть форму для добавления пользователей и список уже добавленных пользователей.
10. Тестирование
- Заполните форму и нажмите кнопку "Add User". После этого вы должны увидеть добавленного пользователя в списке.
- Вы можете добавлять нескольких пользователей, и они будут отображаться на странице.
Заключение
Вы создали простое веб-приложение на Java EE с использованием JPA для управления сущностью User
. Это приложение использует Hibernate как провайдер JPA и H2 в памяти как базу данных. Вы можете расширить это приложение, добавив больше функциональности, такой как редактирование и удаление пользователей, а также улучшив интерфейс пользователя.
Если у вас есть дополнительные вопросы или вам нужна помощь с чем-то еще, не стесняйтесь спрашивать!
В приведенном примере приложение использует H2 в памяти как базу данных. H2 — это легковесная реляционная база данных, которая может работать в памяти (то есть все данные хранятся в оперативной памяти и теряются при завершении работы приложения) или на диске.
Конфигурация базы данных в persistence.xml
В файле persistence.xml
мы указали следующие параметры для подключения к H2:
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
javax.persistence.jdbc.url
:jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
— это URL для подключения к H2 в памяти. ПараметрDB_CLOSE_DELAY=-1
позволяет базе данных оставаться открытой даже после закрытия последнего соединения, аDB_CLOSE_ON_EXIT=FALSE
предотвращает закрытие базы данных при завершении работы приложения.javax.persistence.jdbc.user
иjavax.persistence.jdbc.password
: Для H2 по умолчанию используется пользовательsa
без пароля.
Хранение данных
Поскольку H2 работает в памяти, все данные, которые вы добавляете в базу данных, будут потеряны, когда приложение будет остановлено. Если вы хотите, чтобы данные сохранялись между запусками приложения, вы можете изменить URL подключения на что-то вроде:
<property name="javax.persistence.jdbc.url" value="jdbc:h2:file:./data/test;DB_CLOSE_ON_EXIT=FALSE"/>
Это создаст файл базы данных на диске в папке data
вашего проекта, и данные будут сохраняться между запусками приложения.
Альтернативные базы данных
Если вы хотите использовать другую реляционную базу данных, такую как MySQL, PostgreSQL или Oracle, вам нужно будет:
- Заменить зависимости в
pom.xml
на соответствующий JDBC-драйвер. - Изменить параметры подключения в
persistence.xml
на соответствующие значения для выбранной базы данных.
Если у вас есть конкретные требования к базе данных или вы хотите использовать другую базу данных, дайте знать, и я помогу вам с настройкой!