Ничего не переводите в спящий режим в базе данных после предварительной записи и перезагрузки

#java #hibernate #jpa

Вопрос:

Я пытался изучить JPA,EJB,сервлеты, по большей части все работает нормально. Но что бы я ни делал, я не могу заставить hibernate найти то, что я сохранил после перезапуска приложения на сервере wildfly.

это действительно расстраивает, в журналах нет сообщения об ошибке, ничего, и когда я проверяю, что мой объект находится в диспетчере сущностей с .содержит, он возвращает значение true.

Я попытался добавить .смыть()

Я попытался добавить свой класс в persistance.xml. (он предназначен для автоматического поиска, верно ?)

Я пытался сменить поколение.база данных.действие для : создания, удаления и создания, удаления и нет; не повезло.

вот файлы, если бы кто-нибудь мог помочь, это было бы здорово, потому что я очень запутался.

persistance.xml :

 <?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="EJBColis">
        <class>jpa.Colis</class>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="javax.persistence.schema-generation.database.action" value="create"/>
        </properties>
    </persistence-unit>
</persistence>
 

EJBColis.java

 package ejb;

import java.util.LinkedList;
import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

import jpa.Colis;
import jpa.Mesure;
import jpa.Position;

@Stateless
@LocalBean
public class EJBColis {
    @PersistenceContext
    private EntityManager em;
    
    
    /**
     * Constructeur sans parametre obligatoire
     */
    public EJBColis() {
    }
    
    public Colis addColis(double poid,double valeur,String origin,String destination,Position p ) {
        Colis m = new Colis(poid, valeur, origin, destination, p);
        em.persist(m);
        em.flush();
        em.refresh(m);
        return m;
    }
 
    public Colis findColis(long id) {
        Colis m = em.find(Colis.class, id);
        return m;
    }
    
    public Position changePosition(long ColisId,double longitude,double lat,String origin,String destination) {
        Position m = new Position(longitude,lat, origin, destination);
        Colis c = findColis(ColisId);
        c.setPosition(m);
        em.persist(c);
        em.flush();
        return m;
    }
    
    public Position findPosition(long id) {
        Position m = em.find(Position.class, id);
        return m;
    }
 

}

addColisServlet.java :

 package servlet;

import java.io.IOException;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import ejb.EJBColis;
import jpa.Colis;
import jpa.Mesure;
import jpa.Position;

/**
 * Servlet implementation class AddColisServlet
 */
@WebServlet("/AddColisServlet")
public class AddColisServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    // injection de la reference de l'ejb
    @EJB
    private EJBColis ejb;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public AddColisServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        double Poid = Double.parseDouble(request.getParameter("poid"));
        double valeur = Double.parseDouble(request.getParameter("valeur")) ;
        String origine = request.getParameter("origine");
        String destination = request.getParameter("destination");
        Position position = null;
        
        
        
        
        Colis m = ejb.addColis(Poid, valeur, origine, destination, position);       
        // ajout de la mesure dans la requete
        request.setAttribute("Colis",m);
        // transfert a la JSP d'affichage
        request.getRequestDispatcher("/showColis.jsp").forward(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
 

html-страница, вызывающая addColisServlet :

 <!DOCTYPE html>
<html>
<head>
    <meta charset="ISO-8859-1">
    <title>Manipulation des comptes bancaires</title>
    <link rel="stylesheet" type="text/css" href="css/base.css" >
</head>
<body>
<h1>Manipulation des comptes bancaires</h1>
    <h2>tracker un colis :</h2>
    <form action="ShowColisServlet" method="post">
        ID : <input type="number" name="ID">
        <input type="submit" value="valider">
    </form>
    <h2>Creer un colis</h2>
    <form action="AddColisServlet" method="post">
        Poid : <input type="number" name="poid">
        valeur : <input type="number" name="valeur">
        origine : <input type="text" name="origine">
        destination : <input type="text" name="destination">
        <input type="submit" value="valider">
    </form>
    <h2>modifier position d'un colis:</h2>
    <form action="ModifColisServlet" method="post">
        ID : <input type="text" name="ID">
        latitude : <input type="number" name="lat">
        longitude : <input type="number" name="long">
        emplacement : <input type="text" name="emplacement">
        etat : <input type="text" name="etat">
        <input type="submit" value="chercher">
    </form>
</body>
</html>
 

кроме того, я установил ссылку на github на код, это проект eclipse :

https://github.com/vvhitefox/ColisEJB

Комментарии:

1. какую базу данных вы используете? как выглядит ваш источник данных?

2. tbh я понятия не имею, я думаю, что eclipse делает все самостоятельно, мне вообще не нужно было настраивать базу данных.

3. я забыл упомянуть, что я развертываюсь в wildfly 24, я отредактирую вопрос.

4. Flush сам по себе ничего не делает, кроме как заставляет JPA выдавать инструкции SQL — вы должны быть контекстом транзакции a и зафиксировать этот контекст, чтобы данные сохранялись в БД. Но если у вас нет постоянной настройки базы данных, это может быть не постоянная база данных, и она использует базу данных в памяти, которая удаляется при перезапуске вашего приложения. Настройте базу данных и управляйте ею самостоятельно, чтобы определить, не случилось ли что-то еще.

5. ах! хорошо, значит, он сохраняет его в базу данных, которая в конечном итоге отбрасывается, когда я заканчиваю программу. я попытаюсь настроить реальную базу данных и свяжусь с вами. тнх.