我正在使用Hibernate 4.3和Java 8以及Microsoft SQL 2014(MSSQL)。
我正在尝试使用Hibernate进行实体的merge()。
public void actualizar(FactorUnidadMedida obj){
EntityManagerFactory entityManagerFactory = HibernateUtil.getEntityManagerFactory();
EntityManager em = entityManagerFactory.createEntityManager();
em.getTransaction().begin();
em.merge(obj);
em.getTransaction().commit();
}
当hibernate尝试执行commit()时,我收到以下错误:
参数索引8无效。
我尝试了不同版本的Hibernate(4.3,5.0)和JDBC驱动程序(sqljdbc4.jar,jTDS.jar)。
这是日志:
2016-07-20 15:09:35 Hibernate:更新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
答案 0 :(得分:0)
我不得不改变模型。我把两个Froreing Keys和@Id放在一个单独的字段中。
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;
}
}