我的程序假设从用户那里获取不同的信息以将人保存在表中,但是它没有将信息保存在表中,当我要求打印该信息时,它只是将表打印为空。当我查看数据库并在表上查看数据时,它也没有将它们保存在那里。
这是输入信息的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>
这是显示dataTable的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;
}
}
这是我们在CRUD中使用的HibernateUtil。
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;
}
}
我们用来在HTML dataTable和数据库中的表中创建要调用的人员列表的managedBean(requestedScope)。
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();
}
}
这是我们用来在第一个HTML代码中插入信息的managedBean(requestedScope)。
/**
* 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();
}
}
}
答案 0 :(得分:0)
再清楚阅读一次代码后,错误就出在行中。
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
。 / p>
<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,第一个对象将正确存储在数据库中。之后,您将永远不会遇到这个问题。
希望它对您有帮助。