Моя программа должна принимать различную информацию от пользователя, чтобы сохранить людей в таблице, но она не сохраняет информацию в таблице, когда я прошу ее распечатать, она просто печатает таблицу пустой. И когда я смотрю в базу данных и просматриваю данные в таблице, он тоже не сохраняет их там.
Вот 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();
}
}
}
Я только что отлаживал, и, кажется, все проходит нормально, но я не совсем уверен, правильно ли он устанавливает значения в DTO, где я должен поставить точки останова, чтобы знать правильно?
Ваша функция ultimoId (), что она делает? Вернуть максимальный ID в таблице базы данных? чтобы вы могли добавить +1 при добавлении идентификатора? Почему этот столбец не является автоматически увеличивающимся идентификатором. Вы можете попробовать добавить точку останова к методу createPersona (Persona persona) и проверить личность объекта, чтобы увидеть, существуют ли значения или нет. Также я не вижу, где вы поместили свой DTO / POJO в спящий режим.
Предполагается, что функция ultimoId () подсчитывает количество людей в списке, также является первичным ключом таблицы в БД, поэтому она делает идентификатор для каждого человека, и когда вы вводите новый, он добавляет 1 на номер последнего введенного человека. Если я не ошибаюсь, Hibernate привязан к Persona
Выбрасывает ли это какое-либо исключение? Правильно ли названы таблицы в вашей базе данных?
Они есть, есть idPersona для первичного ключа, затем идет «nombre», «apellido1», «apellido2», «identiftificacion», также не выдает никаких исключений, он просто печатает пустую таблицу после того, как я нажал кнопку для сохранения информации.
ваш код в порядке, и я не могу найти в нем проблемы. Либо значения не определены правильно в DTO, либо может возникнуть исключение. Пожалуйста, попробуйте отладить createPersona и перед строкой session.save(persona); проверьте свой объект персонажа и посмотрите, правильно ли определены значения, и все ли они верны.
Хорошо, я сделаю это, спасибо за вашу помощь и время. Я обязательно обновлюсь, как только сделаю это, и если мне тоже удастся это исправить.
Я только что отлаживал, он говорит, что правильно сохраняет правильную информацию в каждой переменной персонажа. Единственное, что idPersona - 0, а не 1.
Попробуйте один раз установить жестко заданное значение по умолчанию 1 и посмотреть, сохранится ли оно?
Также используйте функцию saveOrUpdate для hibernate orm
Я попытался поставить значение idPersona, установленное на 1, в POJO непосредственно, когда я его объявляю, но оно почему-то все еще показывает его на 0 при сохранении.
Есть ли способ сохранить его исключительно в таблице БД, когда я вижу на нем данные просмотра, чтобы просто отображать их, мне не нужно, чтобы они отображались в самом браузере. Просто введите информацию в браузере и отобразите ее в таблице внутри IDE.




после четкого прочтения кода еще раз ошибка в строке.
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
Вы пробовали отладку и видели, правильно ли ваш html устанавливает значения в DTO перед сохранением?