我在JSF + Hibernate + PostgreSQL + Primefaces中有一个小项目,管理6个表,一个是主表,被称为" Vales",另外5个是主要的辅助,是外来的同一把钥匙。
在辅助设备中,一切运行良好,接口,daos,托管bean和视图。总之,您可以添加新记录,修改它们并更改其状态(我不使用记录删除)。
现在,当我想使用Dialog在主表中生成记录时,我使用辅助表的托管bean以及selectOneMenu和selectItems我得到每个的数据,但我无法得到要选择对象,它们将转到主表。写入记录,但这些其他表中的数据为空。
我这样做可以吗?否则,我该怎么做?
我从主表,主表和主表视图中复制托管bean代码,以便更好地理解。
这个表的设计:
CREATE TABLE public.vales
(
idvale integer NOT NULL DEFAULT nextval(('public.vales_idvale_seq'::text)::regclass),
fechaemision timestamp without time zone NOT NULL,
idguardia integer,
idchofer integer,
idproveedor integer,
kilometros integer NOT NULL,
idcombustible smallint,
idmovil smallint,
litros smallint,
anulado boolean NOT NULL DEFAULT false,
fechaanulacion timestamp without time zone,
idguardiaanula integer,
CONSTRAINT pk_vales PRIMARY KEY (idvale)
WITH (FILLFACTOR=90),
CONSTRAINT fk_vales_choferes FOREIGN KEY (idchofer)
REFERENCES public.choferes (idchofer) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT fk_vales_guardias FOREIGN KEY (idguardia)
REFERENCES public.guardias (idguardia) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT,
CONSTRAINT fk_vales_moviles FOREIGN KEY (idmovil)
REFERENCES public.moviles (idmovil) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_vales_proveedores FOREIGN KEY (idproveedor)
REFERENCES public.proveedores (idproveedor) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT pk_vales_combustibles FOREIGN KEY (idcombustible)
REFERENCES public.combustibles (idcombustible) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT
Managed Bean:
import Daos.DaoVale;
import HibernateUtil.HibernateUtil;
import Pojos.Choferes;
import Pojos.Combustibles;
import Pojos.Guardias;
import Pojos.Moviles;
import Pojos.Proveedores;
import Pojos.Vales;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.primefaces.context.RequestContext;
/**
*
* @author Gustavo
*/
@ManagedBean
@ViewScoped
public class MbVale implements Serializable{
private Vales vale;
private List<Vales> listaVales;
private Session sesion;
private Transaction transaccion;
@ManagedProperty("#{mbMovil}")
private MbMovil mbMovil;
private int idvale;
private Choferes chofer;
private Combustibles combustible;
private Guardias guardia;
private Moviles movil;
private Proveedores proveedor;
private Date fechaEmision;
private int kilometros;
private Short litros;
private boolean anulado;
private Date fechaAnulacion;
private int idGuardiaAnula;
/**
* Creates a new instance of MbVales
*/
public MbVale() {
this.vale = new Vales();
}
public void registrar() throws Exception{
//Antes era public String, pero se cambió a "void" ya que en la vista se cambió el "action" que requiere una cadena, por "actionListener"
this.sesion = null;
this.transaccion = null;
try{
this.sesion = HibernateUtil.getSessionFactory().openSession();
this.transaccion = this.sesion.beginTransaction();
Timestamp fechaActual = new Timestamp(System.currentTimeMillis());
this.vale.setFechaEmision(fechaActual);
System.out.println("Entró al método Registrar");
DaoVale daoV = new DaoVale();
daoV.registrar(this.sesion, this.vale);
this.transaccion.commit();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Registro","Se registró satisfactoriamente el vale"));
//RequestContext.getCurrentInstance().execute("limpiarFormulario('frmRegistrarCombustible')");
this.vale = new Vales(); //Esto reemplaza a la función javascript de borrado de campos del formulario, debido a que al instanciar un nuevo objeto, viene con sus atributos limpios
//return "/vales/valealta"; //Se reemplaza el return, ya que en la vista se cambió el "action" que requiere una cadena, por "actionListener"
}catch(Exception e){
if(this.transaccion != null){
this.transaccion.rollback();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ocurrió un error","Descripcion: " + e.getMessage()));
}
return; //Se reemplaza el return "null", ya que en la vista se cambió el "action" que requiere una cadena, por "actionListener"
}
finally{
if(this.sesion != null){
this.sesion.clear();
this.sesion.close();
}
}
}
public List<Vales> getTodos(){
this.sesion = null;
this.transaccion = null;
try{
DaoVale daoV = new DaoVale();
this.sesion = HibernateUtil.getSessionFactory().openSession();
this.transaccion = this.sesion.beginTransaction();
this.listaVales = daoV.verTodos(this.sesion);
this.transaccion.commit();
return listaVales;
}catch(Exception e){
if(this.transaccion != null){
this.transaccion.rollback();
}
return null;
}finally{
if(this.sesion != null){
this.sesion.clear();
this.sesion.close();
}
}
}
public void modificarVale() throws Exception{
//Antes era public String, pero se cambió a "void" ya que en la vista se cambió el "action" que requiere una cadena, por "actionListener"
this.sesion = null;
this.transaccion = null;
try{
this.sesion = HibernateUtil.getSessionFactory().openSession();
this.transaccion = this.sesion.beginTransaction();
DaoVale daoV = new DaoVale();
daoV.modificar(this.sesion, this.vale);
//System.out.println("IdCombustible: " + this.vale.getIdvale());
this.transaccion.commit();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Registro","Se guardaron satisfactoriamente los cambios"));
//RequestContext.getCurrentInstance().execute("limpiarFormulario('frmRegistrarCombustible')");
//this.vale = new Vales(); //Esto reemplaza a la función javascript de borrado de campos del formulario, debido a que al instanciar un nuevo objeto, viene con sus atributos limpios
//return "/vales/valealta"; //Se reemplaza el return, ya que en la vista se cambió el "action" que requiere una cadena, por "actionListener"
}catch(Exception e){
if(this.transaccion != null){
this.transaccion.rollback();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ocurrió un error","Descripcion: " + e.getMessage()));
}
}
finally{
if(this.sesion != null){
this.sesion.clear();
this.sesion.close();
}
}
}
public void buscarValeEditar(int idVale){
this.sesion = null;
this.transaccion = null;
try{
this.sesion = HibernateUtil.getSessionFactory().openSession();
this.transaccion = this.sesion.beginTransaction();
DaoVale daoV = new DaoVale();
this.vale = daoV.buscarPorCodigo(this.sesion, idVale);
RequestContext.getCurrentInstance().update("frmEditarVale:editarVale");
RequestContext.getCurrentInstance().execute("PF('dialogoEditarVale').show()");
this.transaccion.commit();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Registro","Se guardaron satisfactoriamente los cambios"));
//RequestContext.getCurrentInstance().execute("limpiarFormulario('frmRegistrarCombustible')");
//this.vale = new Vales(); //Esto reemplaza a la función javascript de borrado de campos del formulario, debido a que al instanciar un nuevo objeto, viene con sus atributos limpios
//return "/vales/valealta"; //Se reemplaza el return, ya que en la vista se cambió el "action" que requiere una cadena, por "actionListener"
}catch(Exception e){
if(this.transaccion != null){
this.transaccion.rollback();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ocurrió un error","Descripcion: " + e.getMessage()));
}
}
finally{
if(this.sesion != null){
this.sesion.clear();
this.sesion.close();
}
}
}
public void buscarValeBaja(int idVale){
this.sesion = null;
this.transaccion = null;
try{
this.sesion = HibernateUtil.getSessionFactory().openSession();
this.transaccion = this.sesion.beginTransaction();
DaoVale daoV = new DaoVale();
this.vale = daoV.buscarPorCodigo(this.sesion, idVale);
//System.out.println("IdCombustible buscado para la baja: " + this.vale.getIdvale());
RequestContext.getCurrentInstance().update("frmBajaVale:bajaVale");
RequestContext.getCurrentInstance().execute("PF('dialogoBajaVale').show()");
this.transaccion.commit();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Registro","Se dio de baja satisfactoriamente el registro"));
}catch(Exception e){
if(this.transaccion != null){
this.transaccion.rollback();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ocurrió un error","Descripcion: " + e.getMessage()));
}
}
finally{
if(this.sesion != null){
this.sesion.clear();
this.sesion.close();
}
}
}
public void bajaVale() throws Exception{
//Antes era public String, pero se cambió a "void" ya que en la vista se cambió el "action" que requiere una cadena, por "actionListener"
this.sesion = null;
this.transaccion = null;
try{
this.sesion = HibernateUtil.getSessionFactory().openSession();
this.transaccion = this.sesion.beginTransaction();
Timestamp fechaActual = new Timestamp(System.currentTimeMillis());
this.vale.setAnulado(true);
this.vale.setFechaAnulacion(fechaActual);
//System.out.println("IdCombustible de Baja: " + this.vale.getIdvale());
DaoVale daoV = new DaoVale();
daoV.darBaja(this.sesion, this.vale);
this.transaccion.commit();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Baja","Se dio de baja satisfactoriamente el registro"));
}catch(Exception e){
if(this.transaccion != null){
this.transaccion.rollback();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ocurrió un error","Descripcion: " + e.getMessage()));
}
}
finally{
if(this.sesion != null){
this.sesion.clear();
this.sesion.close();
}
}
}
public Vales getVale() {
return vale;
}
public void setVale(Vales vale) {
this.vale = vale;
}
public List<Vales> getListaVales() {
return listaVales;
}
public void setListaVales(List<Vales> listaVales) {
this.listaVales = listaVales;
}
public MbMovil getMbMovil() {
return mbMovil;
}
public void setMbMovil(MbMovil mbMovil) {
this.mbMovil = mbMovil;
}
public int getIdvale() {
return idvale;
}
public void setIdvale(int idvale) {
this.idvale = idvale;
}
public Choferes getChofer() {
return chofer;
}
public void setChofer(Choferes chofer) {
this.chofer = chofer;
}
public Combustibles getCombustible() {
return combustible;
}
public void setCombustible(Combustibles combustible) {
this.combustible = combustible;
}
public Guardias getGuardia() {
return guardia;
}
public void setGuardia(Guardias guardia) {
this.guardia = guardia;
}
public Moviles getMovil() {
return movil;
}
public void setMovil(Moviles movil) {
this.movil = movil;
}
public Proveedores getProveedor() {
return proveedor;
}
public void setProveedor(Proveedores proveedor) {
this.proveedor = proveedor;
}
public Date getFechaEmision() {
return fechaEmision;
}
public void setFechaEmision(Date fechaEmision) {
this.fechaEmision = fechaEmision;
}
public int getKilometros() {
return kilometros;
}
public void setKilometros(int kilometros) {
this.kilometros = kilometros;
}
public Short getLitros() {
return litros;
}
public void setLitros(Short litros) {
this.litros = litros;
}
public boolean isAnulado() {
return anulado;
}
public void setAnulado(boolean anulado) {
this.anulado = anulado;
}
public Date getFechaAnulacion() {
return fechaAnulacion;
}
public void setFechaAnulacion(Date fechaAnulacion) {
this.fechaAnulacion = fechaAnulacion;
}
public int getIdGuardiaAnula() {
return idGuardiaAnula;
}
public void setIdGuardiaAnula(int idGuardiaAnula) {
this.idGuardiaAnula = idGuardiaAnula;
}
}
最后,视图的代码:
<h:form id="frmAltaVale">
<p:dialog header="Nuevo Vale" widgetVar="dialogoNuevoVale" resizable="false" width="900" showEffect="explode" hideEffect="explode" >
<p:panelGrid id="nuevoVale" columns="3">
<p:outputLabel value="Número de Vale:" for="txtIdentificador"/>
<p:outputLabel id="txtIdentificador" value="#{mbVale.vale.idVale}">
<!--<f:validator validatorId="validadorVacio"/>-->
</p:outputLabel>
<p:message for="txtIdentificador"/>
<p:outputLabel for="txtMovil" value="Móvil:"/>
<p:selectOneMenu id="txtMovil" value="#{mbMovil.movil.idmovil}" style="width:175px">
<f:selectItem itemLabel="Seleccionar" itemValue="" />
<f:selectItems value="#{mbMovil.todos}" var="mov" itemValue ="#{mov.idmovil}" itemLabel = "#{mov.descripcion}"/>
</p:selectOneMenu>
<p:message for="txtMovil"/>
<p:outputLabel for="txtChofer" value="Chofer:" />
<p:selectOneMenu id="txtChofer" value="#{mbChofer.chofer.idchofer}" style="width:175px">
<f:selectItem itemLabel="Seleccionar" itemValue="" />
<f:selectItems value="#{mbChofer.todos}" var="chof" itemValue ="#{chof.idchofer}" itemLabel = "#{chof.nombre}"/>
</p:selectOneMenu>
<p:message for="txtChofer"/>
<p:outputLabel for="txtCombustible" value="Combustible:" />
<p:selectOneMenu id="txtCombustible" value="#{mbCombustible.combustible.idcombustible}" style="width:175px">
<f:selectItem itemLabel="Seleccionar" itemValue="" />
<f:selectItems value="#{mbCombustible.todos}" var="comb" itemValue ="#{comb.idcombustible}" itemLabel = "#{comb.descripcion}"/>
</p:selectOneMenu>
<p:message for="txtCombustible"/>
<p:outputLabel for="txtProveedor" value="Proveedor:" />
<p:selectOneMenu id="txtProveedor" value="#{mbProveedor.proveedor.idproveedor}" style="width:175px">
<f:selectItem itemLabel="Seleccionar" itemValue="" />
<f:selectItems value="#{mbProveedor.todos}" var="prov" itemValue ="#{prov.idproveedor}" itemLabel = "#{prov.descripcion}"/>
</p:selectOneMenu>
<p:message for="txtProveedor"/>
<p:outputLabel value="Kilómetros:" for="txtKilometros"/>
<p:inputText id="txtKilometros" label="Nombre" value="#{mbVale.vale.kilometros}">
<f:validator validatorId="validadorVacio"/>
</p:inputText>
<p:message for="txtKilometros"/>
<p:outputLabel value="Litros:" for="txtLitros"/>
<p:inputText id="txtLitros" label="Nombre" value="#{mbVale.vale.litros}">
<f:validator validatorId="validadorVacio"/>
</p:inputText>
<p:message for="txtLitros"/>
<p:commandButton value="Registrar Vale" actionListener="#{mbVale.registrar()}" update="nuevoVale,:frmListaVales"/>
</p:panelGrid>
</p:dialog>
</h:form>