任何人都可以帮助我解决 Hibernate 和 JSF 的这个缺点吗?

古斯塔沃·埃切尼克

更新表中的某些数据时,我遇到了 Hibernate 问题。

如果我生成一条新记录,它就成功地记录在表中。但是如果我想要做的是执行主键的更新,如果托管 bean 的范围是“RequestScoped”,我会抛出以下错误:“批量更新从更新 [0] 返回了意外的行数;当前行数: 0;预期:1

如果托管 bean 的范围是“ViewScoped”,则错误如下:“无法提取 ResultSet ”。

如果我修改的是另一个数据,则记录令人满意。

我知道修改主键可能是一个权限问题,因为这又是来自另一个表的外键,但最后一个表还不包含记录。如果从 pgAdmin 更改主键,我可以毫无问题地进行更改,因此这不是参照完整性问题。

这让我很困惑。

我添加POJO代码:

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

/**
 * Combustibles generated by hbm2java
 */
public class Combustibles  implements java.io.Serializable {


 private int idcombustible;
 private String descripcion;
 private boolean baja;
 private Date fechabaja;
 private Set valeses = new HashSet(0);

public Combustibles() {
}


public Combustibles(int idcombustible, String descripcion, boolean baja) {
    this.idcombustible = idcombustible;
    this.descripcion = descripcion;
    this.baja = baja;
}
public Combustibles(int idcombustible, String descripcion, boolean baja, Date fechabaja, Set valeses) {
   this.idcombustible = idcombustible;
   this.descripcion = descripcion;
   this.baja = baja;
   this.fechabaja = fechabaja;
   this.valeses = valeses;
}

public int getIdcombustible() {
    return this.idcombustible;
}

public void setIdcombustible(int idcombustible) {
    this.idcombustible = idcombustible;
}
public String getDescripcion() {
    return this.descripcion;
}

public void setDescripcion(String descripcion) {
    this.descripcion = descripcion;
}
public boolean isBaja() {
    return this.baja;
}

public void setBaja(boolean baja) {
    this.baja = baja;
}
public Date getFechabaja() {
    return this.fechabaja;
}

public void setFechabaja(Date fechabaja) {
    this.fechabaja = fechabaja;
}
public Set getValeses() {
    return this.valeses;
}

public void setValeses(Set valeses) {
    this.valeses = valeses;
}
}

同样来自映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 24/03/2017 21:42:13 by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="Pojos.Combustibles" table="combustibles" schema="public" optimistic-lock="version">
    <id name="idcombustible" type="int">
        <column name="idcombustible" />
        <generator class="assigned" />
    </id>
    <property name="descripcion" type="string">
        <column name="descripcion" not-null="true" />
    </property>
    <property name="baja" type="boolean">
        <column name="baja" not-null="true" />
    </property>
    <property name="fechabaja" type="time">
        <column name="fechabaja" length="15" />
    </property>
    <set name="valeses" table="vales" inverse="true" lazy="true" fetch="select">
        <key>
            <column name="idcombustible" not-null="true" />
        </key>
        <one-to-many class="Pojos.Vales" />
    </set>
</class>
</hibernate-mapping>

我添加了 Managed Bean 的代码,里面是一个叫做modifyCombustible()的方法,它负责更新。

package ManagedBeansRequest;

import Daos.DaoCombustibles;
import HibernateUtil.HibernateUtil;
import Pojos.Combustibles;
import java.util.List;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author Gustavo
 */
@Named(value = "mbCombustibles")
@RequestScoped
public class MbCombustibles {

private Combustibles combustible;
private List<Combustibles> listaCombustibles;
private Session sesion;
private Transaction transaccion;

/**
 * Creates a new instance of MbCombustibles
 */
public MbCombustibles() {
    this.combustible = new Combustibles();
}

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();

        DaoCombustibles daoC = new DaoCombustibles();
        daoC.registrar(this.sesion, this.combustible);

        this.transaccion.commit();

        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Registro","Se registró satisfactoriamente el combustible"));

        //RequestContext.getCurrentInstance().execute("limpiarFormulario('frmRegistrarCombustible')");
        this.combustible = new Combustibles();  //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 "/combustibles/combustiblealta"; //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(sesion != null){
            sesion.close();
        } 
    }

}

public List<Combustibles> getTodos(){

    this.sesion = null;
    this.transaccion = null;

    try{

        DaoCombustibles daoC = new DaoCombustibles();

        this.sesion = HibernateUtil.getSessionFactory().openSession();
        this.transaccion = this.sesion.beginTransaction();

        this.listaCombustibles = daoC.verTodos(this.sesion);

        this.transaccion.commit();

        return listaCombustibles;

    }catch(Exception e){
        if(this.transaccion != null){
            this.transaccion.rollback();
        }
        return null;
    }finally{
        if(this.sesion != null){
            this.sesion.close();
        }
    }
}

public void modificarCombustible() 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();

        DaoCombustibles daoC = new DaoCombustibles();
        daoC.modificar(this.sesion, this.combustible);

        this.transaccion.commit();

        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Registro","Se guardaron satisfactoriamente los cambios"));

        //RequestContext.getCurrentInstance().execute("limpiarFormulario('frmRegistrarCombustible')");
        //this.combustible = new Combustibles();  //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 "/combustibles/combustiblealta"; //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){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ocurrió un error","Descripcion: " + e.getMessage()));
            this.transaccion.rollback();
        }
    }
    finally{
        if(sesion != null){
            sesion.close();
        } 
    }

}

public Combustibles getCombustible() {
    return combustible;
}

public void setCombustible(Combustibles combustible) {
    this.combustible = combustible;
}

public List<Combustibles> getListaCombustibles() {
    return listaCombustibles;
}

public void setListaCombustibles(List<Combustibles> listaCombustibles) {
    this.listaCombustibles = listaCombustibles;
}
}

为清楚起见,我还添加了调用 PrimeFaces 对话框的视图的代码部分,以及对话框的完整代码:

<p:column>
    <p:commandButton value="Editar" oncomplete="PF('dialogoEditarCombustible').show()" update=":frmEditarCombustible">
        <f:setPropertyActionListener target="#{mbCombustibles.combustible}" value="#{fila}"/>
     </p:commandButton>
</p:column>


<h:form id="frmEditarCombustible">
    <p:dialog header="Editar Combustible" widgetVar="dialogoEditarCombustible" modal="true" resizable="false" width="900" showEffect="explode" hideEffect="explode" >
        <p:panelGrid id="editarCombustible" columns="3">
                <p:outputLabel value="Identificador de Combustible:" for="txtIdentificador"/>
                <p:inputText id="txtIdentificador" label="Identificador" value="#{mbCombustibles.combustible.idcombustible}">
                    <f:validator validatorId="validadorVacio"/>
                </p:inputText>
                <p:message for="txtIdentificador"/>
                <p:outputLabel value="Nombre de combustible:" for="txtDescripcion"/>
                 <p:inputText id="txtDescripcion" label="Nombre" value="#{mbCombustibles.combustible.descripcion}">
                     <f:validator validatorId="validadorVacio"/>
                 </p:inputText>
                 <p:message for="txtDescripcion"/>
                 <p:commandButton value="Confirmar Edición" actionListener="#{mbCombustibles.modificarCombustible()}" update=":frmListaCombustibles,editarCombustible"/>
         </p:panelGrid>
     </p:dialog>
</h:form>
优点

虽然您可能会发现某些平台允许更改表行的主键值,但对于任何关系兼容数据库来说,这通常是不可接受的做法。

修改行的 PK 值的公认方法是首先禁用或删除拥有该行的表上的 PK。这可能会导致任何其他具有 FK 约束的表也可能必须更改以禁用或删除 FK。完成后,您可以对 PK 或其值进行任何必要的更改,而不会出现任何数据库问题。更改完成后,您需要重新添加或启用 PK,然后是关联的 FK。

这只是关系数据库的性质,它与 Hibernate没有任何关系

我相信(我必须仔细检查代码是否是绝对的)默认情况下,Hibernate 指定 PK 列是insertable=true, updatable=false. 换句话说,它假定相关合规性,除非如上所述发生一些手动工作,否则 PK 不会改变。

因此,即使您尝试修改 Java 代码中的值,Hibernate 也会默默地忽略您的列更新,因此您看到的错误就是这样的结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

任何人都可以帮助解析HCL吗?

任何人都可以通过PIPELINED函数帮助我吗?

任何人都可以向我解释dispatch_sync和dispatch_async之间的区别吗?

任何人都可以通过输入用户名和密码来帮助获得响应吗?

日期选择器不适用于我的jsf和xhtml文件,任何人都可以指导我

任何人都可以在C ++中使用if语句和字符串来帮助我吗?

什么是 P2P 和网状网络?任何人都可以帮助我吗?

我希望 div 是透明的,但不是 div 内的按钮。任何人都可以帮助我吗?

任何人都可以帮助我们解决这些 Xcode 错误吗?

任何人都可以告诉我有关网络托管和 filezilla 主机用户名和密码的区别吗?

任何人都可以帮助我使这个 java 运行没有错误吗?

任何人都可以帮助我解决 Ubuntu 18.04 的 GNOME 停靠栏图标丢失问题的 TigerVNC xstartup 脚本吗?

构建应用程序时出错。任何人都可以帮我解决这个问题吗?

当有多个本地化属性时,任何人都可以帮助我解决主动事件 API 中本地化属性数组的结构吗?

任何人都可以帮助我在 php 的 foreach 循环中使用 json 数据吗?

任何人都可以帮助我在 jQuery 中进行修剪吗?

任何人都可以帮助我在颤振中对齐布局吗?

你好。我想降低 Java 脚本中按钮到顶部的滚动速度。任何人都可以帮助我吗?

当我使用CMake编译程序捕获异常时,出现编译错误。任何人都可以帮助我吗?

任何人都可以帮助我理解下面代码中的问题吗?

任何人都可以帮助我进行以下 SQL 查询吗?

任何人都可以帮助我解决在 Xcode 上使用 swift 从 Firebase 检索数据的问题吗?“源文件中的编辑器占位符”

任何人都可以帮助我进行 webpack 配置吗?

任何人都可以帮助我修复响应式 HTML 手风琴吗?

任何人都可以回答这个问题吗?

任何人都可以帮助我将 html 按钮边框限制为特定长度吗?

我想知道如何正确使用 wait_for 命令。任何人都可以帮助我吗?它的不和谐.py

任何人都可以帮助我通过 CSS 对齐图标吗?

任何人都可以帮助解决这些haskell练习吗?