【问题标题】:ORA-01400: Cannot insert null into (TABLE.COLUMN) (Hibernate)ORA-01400: 无法将 null 插入 (TABLE.COLUMN) (休眠)
【发布时间】:2016-08-21 17:53:41
【问题描述】:

我使用的是休眠 4.3,oracle 11:

当我想插入一个员工时,(它与类别有一对多的关系(一个类别有很多员工)),首先我将一个类别插入数据库,然后我尝试将一个员工插入数据库并得到一个例外,实体的代码是hibernate生成的,所以我不知道怎么回事,问题似乎是我插入员工时Hibernate没有插入ID_CAT,我做错了什么? 我也尝试过从hibernate生成表,但给了我同样的错误,感谢您的关注,希望您能帮助我! (类别和员工都与实体“企业”相关,但这部分效果很好)

例外:

    abr 27, 2016 11:11:58 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1400, SQLState: 23000
abr 27, 2016 11:11:58 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ORA-01400: no se puede realizar una inserción NULL en ("WSPUSER"."TM_EMPLEADOS"."ID_CAT")

abr 27, 2016 11:11:58 AM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements
Error org.hibernate.exception.ConstraintViolationException: could not execute statement
Exception in thread "main" org.hibernate.TransactionException: Transaction not successfully started
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:172)
at tws.hibernate.dao.GenericDAO.endTransaction(GenericDAO.java:59)
at tws.hibernate.dao.GenericDAO.insert(GenericDAO.java:88)
at TwsTestRunner.insertarEmpleado(TwsTestRunner.java:289)
at TwsTestRunner.main(TwsTestRunner.java:27)

实体“员工”:

@Entity
@Table(name = "TM_EMPLEADOS")
public class TmEmpleados implements java.io.Serializable {

    private TmEmpleadosId id;
    private TmEmpresas tmEmpresas;
    private TmCategoria tmCategoria;
    private String nombre;

    public TmEmpleados() {
    }

    public TmEmpleados(TmEmpleadosId id,TmEmpresas tmEmpresas, TmCategoria tmCategoria,String nombre) {
        this.id = id;
        this.tmEmpresas = tmEmpresas;
        this.tmCategoria = tmCategoria;
        this.nombre = nombre;
    }

    @EmbeddedId
    @AttributeOverrides({
            @AttributeOverride(name = "idEmple", column = @Column(name = "ID_EMPLE", nullable = false, length = 25)),
            @AttributeOverride(name = "mand", column = @Column(name = "MAND", nullable = false, length = 3)),
            @AttributeOverride(name = "idEmp", column = @Column(name = "ID_EMP", nullable = false, length = 6)) })
    public TmEmpleadosId getId() {
        return this.id;
    }

    public void setId(TmEmpleadosId id) {
        this.id = id;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "ID_CAT", referencedColumnName = "ID_CAT", nullable = false, insertable = false, updatable = false),
            @JoinColumn(name = "ID_EMP", referencedColumnName = "ID_EMP", nullable = false, insertable = false, updatable = false),
            @JoinColumn(name = "MAND", referencedColumnName = "MAND", nullable = false, insertable = false, updatable = false) })
    public TmCategoria getTmCategoria() {
        return this.tmCategoria;
    }

    public void setTmCategoria(TmCategoria tmCategoria) {
        this.tmCategoria = tmCategoria;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns({
            @JoinColumn(name = "ID_EMP", referencedColumnName = "ID_EMP", nullable = false, insertable = false, updatable = false),
            @JoinColumn(name = "MAND", referencedColumnName = "MAND", nullable = false, insertable = false, updatable = false) })
    public TmEmpresas getTmEmpresas() {
        return this.tmEmpresas;
    }

    @Column(name = "NOMBRE", nullable = false, length = 50)
    public String getNombre() {
        return this.nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
}

实体“类别”:

@Entity
@Table(name = "TM_CATEGORIA")
public class TmCategoria implements java.io.Serializable {

    private TmCategoriaId id;
    private String descripcion;
    private Set<TmEmpleados> tmEmpleadoses = new HashSet<TmEmpleados>(0);

    public TmCategoria() {
    }

    public TmCategoria(TmCategoriaId id, String descripcion) {
        this.id = id;
        this.descripcion = descripcion;
    }

    public TmCategoria(TmCategoriaId id, String descripcion,Set<TmEmpleados> tmEmpleadoses) {
        this.id = id;
        this.descripcion = descripcion;
        this.tmEmpleadoses = tmEmpleadoses;
    }

    @EmbeddedId
    @AttributeOverrides({
            @AttributeOverride(name = "idCat", column = @Column(name = "ID_CAT", nullable = false, length = 3)),
            @AttributeOverride(name = "idEmp", column = @Column(name = "ID_EMP", nullable = false, length = 6)),
            @AttributeOverride(name = "mand", column = @Column(name = "MAND", nullable = false, length = 3)) })
    public TmCategoriaId getId() {
        return this.id;
    }

    public void setId(TmCategoriaId id) {
        this.id = id;
    }

    @Column(name = "DESCRIPCION", nullable = false, length = 50)
    public String getDescripcion() {
        return this.descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    @OneToMany(fetch = FetchType.LAZY, targetEntity = TmEmpleados.class, mappedBy = "tmCategoria")
    public Set<TmEmpleados> getTmEmpleadoses() {
        return this.tmEmpleadoses;
    }

    public void setTmEmpleadoses(Set<TmEmpleados> tmEmpleadoses) {
        this.tmEmpleadoses = tmEmpleadoses;
    }

}

我编辑了休眠配置以显示 sql 和控制台显示:

abr 28, 2016 10:55:39 AM org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 5.1.3.Final
        Hibernate: select tmcategori_.ID_CAT, tmcategori_.ID_EMP, tmcategori_.MAND, tmcategori_.DESCRIPCION as DESCRIPCION4_6_ from WSPUSER.TM_CATEGORIA tmcategori_ where tmcategori_.ID_CAT=? and tmcategori_.ID_EMP=? and tmcategori_.MAND=? 
    Hibernate: select tmempresas_.ID_EMP, tmempresas_.MAND, tmempresas_.DESCRIPCION as DESCRIPCION5_25_ from WSPUSER.TM_EMPRESAS tmempresas_ where tmempresas_.ID_EMP=? and tmempresas_.MAND=?
    Hibernate: insert into WSPUSER.TM_EMPLEADOS ( NOMBRE, ID_EMP, ID_EMPLE, MAND) values (?, ?, ?, ?)
abr 28, 2016 10:55:40 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1400, SQLState: 23000
abr 28, 2016 10:55:40 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ORA-01400: no se puede realizar una inserción NULL en ("WSPUSER"."TM_EMPLEADOS"."ID_CAT")

abr 28, 2016 10:55:40 AM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release
INFO: HHH000010: On release of batch it still contained JDBC statements
Exception in thread "main" org.hibernate.TransactionException: Transaction not successfully started
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:172)
    at tws.hibernate.dao.GenericDAO.endTransaction(GenericDAO.java:59)
    at tws.hibernate.dao.GenericDAO.insert(GenericDAO.java:88)

【问题讨论】:

  • 当您插入TmEmpleados 实例时,您的tmCategoria 属性是否被填充?
  • 是的,我在使用构造函数创建实体 tmcategory 时将其添加为属性
  • 但是您的TmCategoria 实例是否填充了id 字段?根据您收到的错误,这似乎是问题所在。您可能会将 new TmCategoria() 传递给您的 TmEmpleados 实例,这将导致后者的所有属性为空。
  • 是的,我调试了应用程序并且 TmCategoriaId 已正确填写...

标签: hibernate jpa jakarta-ee oracle11g persistence


【解决方案1】:

就我而言,解决方案是删除实体中的 insertable="false", updateble="false"。

【讨论】:

    【解决方案2】:

    您确定已为所有员工填写了“名词”字段吗?

    您收到 ConstraintViolationException 异常,根据您的代码,“nombre”字段不应为 null(可为 null = false)。

    【讨论】:

    • 是的,我使用了hibernate生成的构造函数并正确填充了它
    【解决方案3】:

    我解决了修改数据库的问题:我将所有外键列作为引用表的主键的一部分和相关的子列,所以现在hibernate正确生成了sql,可能不是最干净的方式但有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 2018-11-08
      • 2011-08-23
      • 2013-02-21
      • 2015-06-04
      • 2016-06-21
      • 2021-12-03
      相关资源
      最近更新 更多