【问题标题】:Hibernate S1093 or 07009 Invalid parameter indexHibernate S1093 或 07009 参数索引无效
【发布时间】:2016-11-24 05:01:59
【问题描述】:

我正在使用 Hibernate 4.3 和 Java 8 以及 Microsoft SQL 2014 (MSSQL)。

我正在尝试使用 Hibernate 对实体进行合并()。

public void actualizar(FactorUnidadMedida obj){
    EntityManagerFactory entityManagerFactory = HibernateUtil.getEntityManagerFactory();
    EntityManager em = entityManagerFactory.createEntityManager();
    em.getTransaction().begin();
    em.merge(obj);
    em.getTransaction().commit();
}

当休眠尝试执行 commit() 时,我收到以下错误:

参数索引 8 无效。

我尝试了不同版本的 Hibernate(4.3、5.0)和 JDBC 驱动程序(sqljdbc4.jar、jTDS.jar)。

这是日志:

2016-07-20 15:09:35 休眠:更新 FactorUnidadMedida 设置 estado=?, factor=?, fecha=?, usuario=? idEmpresa=?和 codUnidadDestino=?和 codUnidadOrigen=?

2016-07-20 15:09:35 TRACE BasicBinder:65 - 绑定参数 [1] 作为 [VARCHAR] - [AC]

2016-07-20 15:09:35 TRACE BasicBinder:65 - 绑定参数 [2] 为 [NUMERIC] - [0.01]

2016-07-20 15:09:35 TRACE BasicBinder:65 - 绑定参数 [3] 作为 [TIMESTAMP] - [Wed Jul 20 15:09:25 COT 2016]

2016-07-20 15:09:35 TRACE BasicBinder:65 - 绑定参数 [4] 作为 [VARCHAR] - [ADMIN]

2016-07-20 15:09:35 TRACE BasicBinder:65 - 绑定参数 [5] 作为 [INTEGER] - [1]

2016-07-20 15:09:35 TRACE BasicBinder:65 - 绑定参数 [6] 作为 [VARCHAR] - [MTR]

2016-07-20 15:09:35 TRACE BasicBinder:65 - 绑定参数 [7] 作为 [INTEGER] - [1]

2016-07-20 15:09:35 TRACE BasicBinder:65 - 绑定参数 [8] 作为 [VARCHAR] - [CMS]

2016-07-20 15:09:35 INFO AbstractBatchImpl:193 - HHH000010:在批处理发布时,它仍然包含 JDBC 语句

2016-07-20 15:09:35 WARN SqlExceptionHelper:127 - SQL 错误:0,SQLState:07009

2016-07-20 15:09:35 错误 SqlExceptionHelper:129 - 参数索引 8 无效。

其他信息:

实体有两个复合外键。

package co.com.hermesWeb.model;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="FactorUnidadMedida")
@IdClass(FactorUnidadMedidaPK.class)
public class FactorUnidadMedida implements Serializable {
    private static final long serialVersionUID = -4123771692139896513L;

    @Id
    private int idEmpresa = 0;
    @Id
    @OneToOne(fetch=FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name="idEmpresa", referencedColumnName="idEmpresa", insertable=false, updatable=false),
        @JoinColumn(name="codUnidadOrigen", referencedColumnName="codigo", insertable=false, updatable=false)
    })
    private UnidadMedida unidadMedidaOrigen = null; 
    @Id
    @OneToOne(fetch=FetchType.EAGER)
    @JoinColumns({
        @JoinColumn(name="idEmpresa", referencedColumnName="idEmpresa", insertable=false, updatable=false),
        @JoinColumn(name="codUnidadDestino", referencedColumnName="codigo", insertable=false, updatable=false)
    })
    private UnidadMedida unidadMedidaDestino = null;
    private BigDecimal factor = BigDecimal.ZERO;
    private String estado = "";
    private String usuario = "";
    private Date fecha = null;

    public int getIdEmpresa() {
        return idEmpresa;
    }
    public void setIdEmpresa(int idEmpresa) {
        this.idEmpresa = idEmpresa;
    }
    public UnidadMedida getUnidadMedidaOrigen() {
        return unidadMedidaOrigen;
    }
    public void setUnidadMedidaOrigen(UnidadMedida unidadMedidaOrigen) {
        this.unidadMedidaOrigen = unidadMedidaOrigen;
    }
    public UnidadMedida getUnidadMedidaDestino() {
        return unidadMedidaDestino;
    }
    public void setUnidadMedidaDestino(UnidadMedida unidadMedidaDestino) {
        this.unidadMedidaDestino = unidadMedidaDestino;
    }
    public BigDecimal getFactor() {
        return factor;
    }
    public void setFactor(BigDecimal factor) {
        this.factor = factor;
    }
    public String getEstado() {
        return estado;
    }
    public void setEstado(String estado) {
        this.estado = estado;
    }
    public String getUsuario() {
        return usuario;
    }
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }
    public Date getFecha() {
        return fecha;
    }
    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

}

请注意,[idEmpresa, codUnidadOrigen] 和 [idEmpresa, codUnidadDestino] 是我的外键,它们使用相同的字段 [idEmpresa]。 出于这个原因有什么问题吗?

这是一个数据库表图像: http://imgur.com/NRI3q3j

这是完整的堆栈:log4j.logger.org.hibernate=ALL https://gist.github.com/ferchoman09/45df8600de44eebc37a693e53a2bd391

【问题讨论】:

    标签: java sql-server hibernate jpa jdbc


    【解决方案1】:

    我不得不更改模型。我将没有 @Id 的两个 Froreing 键放在单独的字段中。

    package co.com.hermesWeb.model;
    
    import java.io.Serializable;
    import java.math.BigDecimal;
    import java.util.Date;
    
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.Id;
    import javax.persistence.IdClass;
    import javax.persistence.JoinColumn;
    import javax.persistence.JoinColumns;
    import javax.persistence.OneToOne;
    import javax.persistence.Table;
    
    @Entity
    @Table(name="FactorUnidadMedida")
    @IdClass(FactorUnidadMedidaPK.class)
    public class FactorUnidadMedida implements Serializable {
        private static final long serialVersionUID = -4123771692139896513L;
    
        @Id
        private int idEmpresa = 0;
        @Id
        private String codUnidadOrigen = "";
        @Id
        private String codUnidadDestino = "";
    
        @OneToOne(fetch=FetchType.EAGER)
        @JoinColumns({
            @JoinColumn(name="idEmpresa", referencedColumnName="idEmpresa", insertable=false, updatable=false),
            @JoinColumn(name="codUnidadOrigen", referencedColumnName="codigo", insertable=false, updatable=false)
        })
        private UnidadMedida unidadMedidaOrigen = null; 
    
        @OneToOne(fetch=FetchType.EAGER)
        @JoinColumns({
            @JoinColumn(name="idEmpresa", referencedColumnName="idEmpresa", insertable=false, updatable=false),
            @JoinColumn(name="codUnidadDestino", referencedColumnName="codigo", insertable=false, updatable=false)
        })
        private UnidadMedida unidadMedidaDestino = null;
        private BigDecimal factor = BigDecimal.ZERO;
        private String estado = "";
        private String usuario = "";
        private Date fecha = null;
    
        public int getIdEmpresa() {
            return idEmpresa;
        }
        public void setIdEmpresa(int idEmpresa) {
            this.idEmpresa = idEmpresa;
        }
        public UnidadMedida getUnidadMedidaOrigen() {
            return unidadMedidaOrigen;
        }
        public UnidadMedida getUnidadMedidaDestino() {
            return unidadMedidaDestino;
        }
        public BigDecimal getFactor() {
            return factor;
        }
        public void setFactor(BigDecimal factor) {
            this.factor = factor;
        }
        public String getEstado() {
            return estado;
        }
        public void setEstado(String estado) {
            this.estado = estado;
        }
        public String getUsuario() {
            return usuario;
        }
        public void setUsuario(String usuario) {
            this.usuario = usuario;
        }
        public Date getFecha() {
            return fecha;
        }
        public void setFecha(Date fecha) {
            this.fecha = fecha;
        }
        public String getCodUnidadOrigen() {
            return codUnidadOrigen;
        }
        public void setCodUnidadOrigen(String codUnidadOrigen) {
            this.codUnidadOrigen = codUnidadOrigen;
        }
        public String getCodUnidadDestino() {
            return codUnidadDestino;
        }
        public void setCodUnidadDestino(String codUnidadDestino) {
            this.codUnidadDestino = codUnidadDestino;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2014-05-15
      相关资源
      最近更新 更多