Мой Hibernate CRUD не сохраняет данные в таблице, но показывает, что таблица пуста

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

Вот HTML-код для ввода информации.

<html xmlns = "http://www.w3.org/1999/xhtml"
  xmlns:ui = "http://xmlns.jcp.org/jsf/facelets"
  xmlns:h = "http://xmlns.jcp.org/jsf/html"
  xmlns:p = "http://primefaces.org/ui">
<body>
    <ui:composition template = "./plantilla/plantilla.xhtml">
        <ui:define name = "head">
        </ui:define>
        <ui:define name = "content">
            <h4>Ingresar Información</h4>
            <hr/>
            <h:form id = "formulario">
                <div class = "form-horizontal">
                    <div class = "form-group">
                        <h:outputLabel value = "Identificación" for = "id" class = "control-label col-sm-3"/>
                        <div class = "col-sm-3">
                            <h:inputText id = "id" required = "true" class = "form-control"
                                         requiredMessage = "Campo requerido"
                                         value = "#{ingresar.identificacion}">
                            </h:inputText>
                            <h:message for = "id" class = "text-danger"/>
                        </div>
                    </div>
                    <div class = "form-group">
                        <h:outputLabel value = "Nombre" for = "nombre" class = "control-label col-sm-3"/>
                        <div class = "col-sm-3">
                            <h:inputText id = "nombre" required = "true" class = "form-control"
                                         requiredMessage = "Campo requerido"
                                         value = "#{ingresar.nombre}">
                            </h:inputText>
                            <h:message for = "nombre" class = "text-danger"/>
                        </div>
                    </div>
                    <div class = "form-group">
                        <h:outputLabel value = "Apellido 1" for = "apellido1" class = "control-label col-sm-3"/>
                        <div class = "col-sm-3">
                            <h:inputText id = "apellido1" required = "true" class = "form-control"
                                         requiredMessage = "Campo requerido"
                                         value = "#{ingresar.apellido1}">
                            </h:inputText>
                            <h:message for = "apellido1" class = "text-danger"/>
                        </div>
                    </div>
                    <div class = "form-group">
                        <h:outputLabel value = "Apellido 2" for = "apellido2" class = "control-label col-sm-3"/>
                        <div class = "col-sm-3">
                            <h:inputText id = "apellido2" required = "true" class = "form-control"
                                         requiredMessage = "Campo requerido"
                                         value = "#{ingresar.apellido2}">
                            </h:inputText>
                            <h:message for = "apellido2" class = "text-danger"/>
                        </div>
                    </div>
                    <div style = "text-align: center;">
                        <h:commandButton value = "Guardar" action = "#{ingresar.guardarInformacion}"/>
                    </div>                        
                </div>
            </h:form>
        </ui:define>
    </ui:composition>
</body>

Вот HTML-код для отображения таблицы данных.

<html xmlns = "http://www.w3.org/1999/xhtml"
  xmlns:ui = "http://xmlns.jcp.org/jsf/facelets"
  xmlns:p = "http://primefaces.org/ui"
  xmlns:h = "http://xmlns.jcp.org/jsf/html">

<body>
    <ui:composition template = "./plantilla/plantilla.xhtml">
        <ui:define name = "content">
            <p:dataTable var = "persona" value = "#{verestudiante.personas}" rows = "5" paginator = "true">
                <p:column headerText = "Identificacion">
                    <h:outputText value = "#{personas.identificacion}"/>
                </p:column>
                <p:column headerText = "Nombre">
                    <h:outputText value = "#{personas.nombre}"/>
                </p:column>
                <p:column headerText = "Primer Apellido">
                    <h:outputText value = "#{personas.apellido1}"/>
                </p:column>
                <p:column headerText = "Segundo Apellido">
                    <h:outputText value = "#{personas.apellido2}"/>
                </p:column>
            </p:dataTable>
        </ui:define>

    </ui:composition>

</body>

Вот POJO со всеми переменными от людей, которых мы вводим в базу данных.

public class Persona {
private int idPersona;
private String nombre;
private String apellido1;
private String apellido2;
private String identificacion;


public static Persona getPersona(Persona personaParametro){
    Persona persona = new Persona();
    persona.idPersona = personaParametro.idPersona;
    persona.nombre = personaParametro.nombre;
    persona.apellido1 = personaParametro.apellido1;
    persona.apellido2 = personaParametro.apellido2;
    persona.identificacion = personaParametro.identificacion;
    return persona;
}

public int getIdPersona() {
    return idPersona;
}

public void setIdPersona(int idPersona) {
    this.idPersona = idPersona;
}

public String getNombre() {
    return nombre;
}

public void setNombre(String nombre) {
    this.nombre = nombre;
}

public String getApellido1() {
    return apellido1;
}

public void setApellido1(String apellido1) {
    this.apellido1 = apellido1;
}

public String getApellido2() {
    return apellido2;
}

public void setApellido2(String apellido2) {
    this.apellido2 = apellido2;
}

public String getIdentificacion() {
    return identificacion;
}

public void setIdentificacion(String identificacion) {
    this.identificacion = identificacion;
}

}

Вот HibernateUtil, который мы использовали в CRUD.

public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {
    try {
        // Create the SessionFactory from standard (hibernate.cfg.xml) 
        // config file.
        //sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        sessionFactory = new org.hibernate.cfg.Configuration().configure().buildSessionFactory();
    } catch (Throwable ex) {
        // Log the exception. 
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}

}

ManagedBean (requestScope) мы использовали для создания списка людей, которым нужно вызвать, в HTML-таблице данных и таблице в базе данных.

public class verestudiante{
private List<Estudiante> personas = new ArrayList<Estudiante>();

public List<Estudiante> getPersonas() {
    return personas;
}

public verestudiante() {
}

@PostConstruct
public void init(){
    EstudianteGestion personaGestion = new EstudianteGestion ();
    personas = personaGestion.readPersonas();
}

}

Вот ManagedBean (requestScope), который мы использовали для вставки информации в первый HTML-код.

/**
 * Creates a new instance of ingresar
 */
public ingresar() {
}

public String guardarInformacion(){  
    PersonaGestion personaGestion = new PersonaGestion();
    Persona persona = Persona.getPersona(this);
    personaGestion.createPersona(persona);
    return "verestudiante";
}

}

И, наконец, вот CRUD.

public class PersonaGestion {

public void createPersona(Persona persona){
    Session session = null;
    try{
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        session = sessionFactory.openSession();
        session.beginTransaction();
        persona.setIdPersona((ultimoId() + 1));
        session.save(persona);
        session.getTransaction().commit();
    }
    catch(Exception e){
        System.out.println("Error: " + e.getMessage());
    }
    finally{
        session.close();
    }        
}

public int ultimoId(){
    Session session = null;
    try{
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        session = sessionFactory.openSession();
        session.beginTransaction();
        Persona ultimo = (Persona) session.createCriteria(Persona.class)
                .addOrder(Order.desc("idPersona")).setMaxResults(1).uniqueResult();
        session.getTransaction().commit();
        return ultimo.getIdPersona();
    }
    catch(Exception e){
        System.out.println("Error: " + e.getMessage());
    }
    finally{
        session.close();
    } 
    return -1;
}

public List<Persona> readPersonas(){
    Session session = null;
    try{
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        session = sessionFactory.openSession();
        session.beginTransaction();
        //Leer la informacion que esta en BD
        Query query = session.createQuery("from Tabla");
        List<Persona> lista = query.list();
        session.getTransaction().commit();
        return lista;
    }
    catch(Exception e){
        System.out.println("Error: " + e.getMessage());
    }
    finally{
        session.close();
    } 
    return null;
}

public Persona readPersona(String identificacion){
    Session session = null;
    try{
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        session = sessionFactory.openSession();
        session.beginTransaction();
        //leer una sola persona por identificacion
        Query query = session.createQuery("from Persona where identificacion = :identificacionParametro");
        query.setParameter("identificacionParametro", identificacion);
        List<Persona> lista = query.list();
        if (lista.size() > 0)
            return lista.get(0);
        session.getTransaction().commit();
    }
    catch(Exception e){
        System.out.println("Error: " + e.getMessage());
    }
    finally{
        session.close();
    } 
    return null;
}

public void updatePersona(Persona persona){
    Session session = null;
    try{
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        session = sessionFactory.openSession();
        session.beginTransaction();
        session.update(persona);
        session.getTransaction().commit();
    }
    catch(Exception e){
        System.out.println("Error: " + e.getMessage());
    }
    finally{
        session.close();
    } 
}

public void deletePersona(Persona persona){
    Session session = null;
    try{
        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        session = sessionFactory.openSession();
        session.beginTransaction();
        session.delete(persona);
        session.getTransaction().commit();
    }
    catch(Exception e){
        System.out.println("Error: " + e.getMessage());
    }
    finally{
        session.close();
    } 
}

}

Вы пробовали отладку и видели, правильно ли ваш html устанавливает значения в DTO перед сохранением?

Farhan Qasim 13.12.2018 08:19

Я только что отлаживал, и, кажется, все проходит нормально, но я не совсем уверен, правильно ли он устанавливает значения в DTO, где я должен поставить точки останова, чтобы знать правильно?

Luis Sequeira 13.12.2018 08:31

Ваша функция ultimoId (), что она делает? Вернуть максимальный ID в таблице базы данных? чтобы вы могли добавить +1 при добавлении идентификатора? Почему этот столбец не является автоматически увеличивающимся идентификатором. Вы можете попробовать добавить точку останова к методу createPersona (Persona persona) и проверить личность объекта, чтобы увидеть, существуют ли значения или нет. Также я не вижу, где вы поместили свой DTO / POJO в спящий режим.

Farhan Qasim 13.12.2018 08:35

Предполагается, что функция ultimoId () подсчитывает количество людей в списке, также является первичным ключом таблицы в БД, поэтому она делает идентификатор для каждого человека, и когда вы вводите новый, он добавляет 1 на номер последнего введенного человека. Если я не ошибаюсь, Hibernate привязан к Persona

Luis Sequeira 13.12.2018 08:42

Выбрасывает ли это какое-либо исключение? Правильно ли названы таблицы в вашей базе данных?

Farhan Qasim 13.12.2018 08:47

Они есть, есть idPersona для первичного ключа, затем идет «nombre», «apellido1», «apellido2», «identiftificacion», также не выдает никаких исключений, он просто печатает пустую таблицу после того, как я нажал кнопку для сохранения информации.

Luis Sequeira 13.12.2018 08:54

ваш код в порядке, и я не могу найти в нем проблемы. Либо значения не определены правильно в DTO, либо может возникнуть исключение. Пожалуйста, попробуйте отладить createPersona и перед строкой session.save(persona); проверьте свой объект персонажа и посмотрите, правильно ли определены значения, и все ли они верны.

Farhan Qasim 13.12.2018 09:00

Хорошо, я сделаю это, спасибо за вашу помощь и время. Я обязательно обновлюсь, как только сделаю это, и если мне тоже удастся это исправить.

Luis Sequeira 13.12.2018 09:05

Я только что отлаживал, он говорит, что правильно сохраняет правильную информацию в каждой переменной персонажа. Единственное, что idPersona - 0, а не 1.

Luis Sequeira 13.12.2018 16:07

Попробуйте один раз установить жестко заданное значение по умолчанию 1 и посмотреть, сохранится ли оно?

Farhan Qasim 13.12.2018 16:22

Также используйте функцию saveOrUpdate для hibernate orm

Farhan Qasim 13.12.2018 16:22

Я попытался поставить значение idPersona, установленное на 1, в POJO непосредственно, когда я его объявляю, но оно почему-то все еще показывает его на 0 при сохранении.

Luis Sequeira 13.12.2018 16:39

Есть ли способ сохранить его исключительно в таблице БД, когда я вижу на нем данные просмотра, чтобы просто отображать их, мне не нужно, чтобы они отображались в самом браузере. Просто введите информацию в браузере и отобразите ее в таблице внутри IDE.

Luis Sequeira 13.12.2018 16:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
13
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

после четкого прочтения кода еще раз ошибка в строке.

return ultimo.getIdPersona();

Когда вы запускаете ее в первый раз, в таблице нет данных, поэтому строка выше вызовет исключение NullPointerException. После этого исключения вы его поймаете и вернете -1, как указано в коде:

catch(Exception e){
    System.out.println("Error: " + e.getMessage());
}
finally{
    session.close();
} 
return -1;

Когда вы возвращаете -1, personaId становится 0 в строке

persona.setIdPersona((ultimoId() + 1));

Этот 0 вызывает ошибку при сохранении данных. Хороший способ решить эту проблему - изменить структуру первичного ключа, он должен автоматически увеличиваться, определенный в базе данных, а в сопоставлении вы должны установить генератор на identity вместо assigned.

<generator class = "identity"></generator>

Или, если вы просто хотите правильно запустить свой код, вы должны сделать следующее в своей функции ultimo.

session.beginTransaction();
Persona ultimo = (Persona) session.createCriteria(Persona.class)
                .addOrder(Order.desc("idPersona")).setMaxResults(1).uniqueResult();
session.getTransaction().commit();
return ultimo !=null ? ultimo.getIdPersona() : 1;

Вы вернете 1, и первый объект будет правильно сохранен в вашей базе данных. Впоследствии вы никогда не столкнетесь с этой проблемой.

Надеюсь, это поможет тебе.

Буду рад, если вы также проголосуете за мой ответ. Спасибо @LuisSequeira

Farhan Qasim 15.12.2018 00:52

Другие вопросы по теме