Skip to content

Maven с JPA, на WildFly

Давайте создадим простой проект на Maven с использованием JPA, который будет развернут на WildFly. Мы создадим приложение, которое будет управлять сущностью User. Вот шаги, которые мы пройдем:

  1. Создание структуры проекта Maven
  2. Настройка pom.xml
  3. Создание сущности JPA
  4. Создание DAO (Data Access Object)
  5. Создание сервлета для взаимодействия с пользователем
  6. Настройка WildFly для работы с JPA
  7. Развертывание и тестирование приложения

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.

  1. Сборка проекта: Откройте терминал, перейдите в корневую папку вашего проекта и выполните команду:

bash mvn clean package

Это создаст файл WAR в папке target.

  1. Развертывание на WildFly:
  2. Скопируйте файл WAR из target/my-jpa-app.war в папку standalone/deployments вашего WildFly.
  3. Убедитесь, что WildFly запущен. Вы можете запустить его с помощью команды:

    bash ./standalone.sh

  4. Доступ к приложению: Откройте веб-браузер и перейдите по адресу:

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, вам нужно будет:

  1. Заменить зависимости в pom.xml на соответствующий JDBC-драйвер.
  2. Изменить параметры подключения в persistence.xml на соответствующие значения для выбранной базы данных.

Если у вас есть конкретные требования к базе данных или вы хотите использовать другую базу данных, дайте знать, и я помогу вам с настройкой!