2016-04-27 16 views
1
私が使用している

が4.3を休止、Oracleの11は:ORA-01400:(TABLE.COLUMN)(休止状態)にNULLを挿入することはできませんが

私は従業員を挿入する、(それは多くの関係1とを持っていますカテゴリ(1つのカテゴリには多くの従業員がいます))、最初にカテゴリをdbに挿入してから、データベースに従業員を挿入して例外を取得しようとしましたが、エンティティのコードは休止状態によって生成されたため、間違っている、問題は、私が従業員を挿入しているときにHibernateがID_CATを挿入していないと思われます。何が間違っていますか?私はまた、休止状態からテーブルを生成しようとしましたが、私に同じエラーが表示されますので、ご協力いただきありがとうございます。 (カテゴリおよび従業員は両方のエンティティ "企業" に関連しますが、この部分がうまく機能している)

例外:

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 "従業員":

@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 "CATEGORY":

@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を表示するためにhibernate configを編集し、コンソールにt彼:

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) 
+0

'TmEmpleados'インスタンスを挿入するとき、あなたの' tmCategoria'属性は満たされていますか? – aribeiro

+0

はい、私はコンストラクタを使用してそれを作成するときに、エンティティとしてtmcategoryエンティティを追加します – MikeOx

+0

しかし、あなたの 'TmCategoria'インスタンスに' id'フィールドが埋め込まれていますか?あなたが得ているエラーによると、それは問題だと思われます。 'TmEmpleados'インスタンスに' new TmCategoria() 'を渡して、後者のすべての属性がnullになるかもしれません。 – aribeiro

答えて

0

データベースを変更する問題を解決しました。参照されたテーブルと子カラムのプライマリキーのすべての外部キーカラムを作成しました。これで、SQLを適切に生成します。

0

すべての従業員にフィールド「nombre」が設定されていることを確認してください。

あなたはConstraintViolationExceptionを取得しています。コードに従って、「nombre」フィールドはnull(nullable = false)であってはなりません。

+0

はい、私は、生成されたコンストラクタを休止状態で使用し、正しく実装しました – MikeOx

関連する問題