Foros del Web » Programación para mayores de 30 ;) » Java »

Error en insert con hibernate

Estas en el tema de Error en insert con hibernate en el foro de Java en Foros del Web. Buenos días! Estoy haciendo una aplicación web en java con spring, tengo una base de datos en Oracle que conecto con la aplicación con hibernate. ...
  #1 (permalink)  
Antiguo 10/04/2015, 02:27
 
Fecha de Ingreso: febrero-2013
Ubicación: Sevilla
Mensajes: 5
Antigüedad: 11 años, 2 meses
Puntos: 0
Error en insert con hibernate

Buenos días!

Estoy haciendo una aplicación web en java con spring, tengo una base de datos en Oracle que conecto con la aplicación con hibernate. No es la primera vez que hago algo por el estilo pero esta vez con algunas tablas me da un error al hacer los insert, a ver si me podéis echar una mano.

La tabla donde intento insertar se llama TPerfilDemanda la clave es empresa y perfil, tiene TLinea como FK y a parte tiene 2 campos alfanuméricos. Por su parte, la tabla TLinea tiene empresa y línea de PK, TEstacion y TTipoLinea como FK y otra serie de campos sin más interés.

Cuando intento hacer el insert en TPerfilDemanda me devuelve el siguiente error:

Estado HTTP 500 - Request processing failed; nested exception is org.hibernate.exception.ConstraintViolationExcepti on: could not execute statement
java.sql.SQLIntegrityConstraintViolationException: ORA-01400: no se puede realizar una inserción NULL en ("DATADA"."T_PERFIL_DEMANDA"."IDLINEA").

He realizado insert idénticos en otras tablas del sistema y no me produce errores, además también he probado a hacer el insert informado el objeto TLinea a mano en vez de recuperándolo de la BBDD y me produce el mismo error, he mirado un montón de foros y webs y ya no se qué mirar más.

La función para insertar es:
Código:
public int save(TPerfilDemanda perfil) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.getTransaction().begin();
        session.saveOrUpdate(perfil);
        session.getTransaction().commit();
        session.close();
        return perfil.getId().getIdperfildemanda();
    }
que se llama desde:
Código:
TPerfilDemandaId pId = new TPerfilDemandaId();
            pId.setIdempresa(empresa);
            
            ILineaRepository repositorioLinea = new LineaRepositoryImpl();
            TLinea linea = repositorioLinea.getById(empresa, form.getLinea());
            p = new TPerfilDemanda(pId, linea, form.getNombre(), (short)0);
            
            repositorio.save(p);
La función que recupera la línea (La parte de //iniciar datos la añadí porque buscando información encontré que al recuperar los datos podía tener problemas en la persistencia de los datos y era necesario inicializar los datos de las FK):
Código:
public TLinea getById(int idempresa, int id) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Criteria criteria = session.createCriteria(TLinea.class);
        criteria.add(Restrictions.eq("id.idlinea", id));
        criteria.add(Restrictions.eq("id.idempresa", idempresa));
        TLinea linea = (TLinea)criteria.uniqueResult();
        
        //iniciar datos
        Hibernate.initialize(linea.getTTipoLinea());
        Hibernate.initialize(linea.getId());
        Hibernate.initialize(linea.getTEstacion());
                
        session.close();
        return linea;
    }
Los XML de TLinea y TPerfilDemanda (En TPerfilDemanda, en la relación many-to-one con TLinea los parámetros update e insert los tengo a "false" porque me los creó automáticamente así al crear los POJOS, pero los he intentado cambiar y me da un error de mapeo)
Código:
<?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 09-abr-2015 12:39:36 by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="com.shs.datada.entity.TLinea" table="T_LINEA" schema="DATADA" optimistic-lock="version">
        <composite-id name="id" class="com.shs.datada.entity.TLineaId">
            <key-property name="idempresa" type="int">
                <column name="IDEMPRESA" precision="8" scale="0" />
            </key-property>
            <key-property name="idlinea" type="int">
                <column name="IDLINEA" precision="8" scale="0" />
            </key-property>
        </composite-id>
        <many-to-one name="TEstacion" class="com.shs.datada.entity.TEstacion" update="false" insert="false" fetch="select">
            <column name="IDEMPRESA" precision="8" scale="0" not-null="true" />
            <column name="IDESTACIONORIGEN" precision="8" scale="0" not-null="true" />
        </many-to-one>
        <many-to-one name="TTipoLinea" class="com.shs.datada.entity.TTipoLinea" update="false" insert="false" fetch="select">
            <column name="IDEMPRESA" precision="8" scale="0" not-null="true" />
            <column name="IDTIPOLINEA" precision="8" not-null="true" />
        </many-to-one>
        <property name="nombrelinea" type="string">
            <column name="NOMBRELINEA" length="50" not-null="true" />
        </property>
        <property name="distancia" type="int">
            <column name="DISTANCIA" precision="8" scale="0" not-null="true" />
        </property>
        <property name="comentario" type="string">
            <column name="COMENTARIO" length="100" not-null="true" />
        </property>
        <property name="idestaciondestino" type="int">
            <column name="IDESTACIONDESTINO" precision="8" scale="0" not-null="true" />
        </property>
        <property name="codigolinea" type="string">
            <column name="CODIGOLINEA" length="5" not-null="true" />
        </property>
        <property name="codigointerno" type="string">
            <column name="CODIGOINTERNO" length="5" not-null="true" />
        </property>
        <property name="cercania" type="boolean">
            <column name="CERCANIA" precision="1" scale="0" not-null="true" />
        </property>
        <property name="lejania" type="boolean">
            <column name="LEJANIA" precision="1" scale="0" not-null="true" />
        </property>
        <set name="TPerfilDemandas" table="T_PERFIL_DEMANDA" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="IDEMPRESA" precision="8" scale="0" not-null="true" />
                <column name="IDLINEA" precision="8" not-null="true" />
            </key>
            <one-to-many class="com.shs.datada.entity.TPerfilDemanda" />
        </set>
        <set name="TPlanificacionLineas" table="T_PLANIFICACION_LINEA" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="IDEMPRESA" precision="8" scale="0" not-null="true" />
                <column name="IDLINEA" precision="8" scale="0" not-null="true" />
            </key>
            <one-to-many class="com.shs.datada.entity.TPlanificacionLinea" />
        </set>
        <set name="TExcepcionConductors" table="T_EXCEPCION_CONDUCTOR" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="IDEMPRESA" precision="8" scale="0" not-null="true" />
                <column name="IDLINEA" precision="8" scale="0" not-null="true" />
            </key>
            <one-to-many class="com.shs.datada.entity.TExcepcionConductor" />
        </set>
        <set name="TTrayectos" table="T_TRAYECTO" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="IDEMPRESA" precision="8" scale="0" not-null="true" />
                <column name="IDLINEA" precision="8" scale="0" not-null="true" />
            </key>
            <one-to-many class="com.shs.datada.entity.TTrayecto" />
        </set>
        <set name="TExcepcionVehiculos" table="T_EXCEPCION_VEHICULO" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="IDEMPRESA" precision="8" scale="0" not-null="true" />
                <column name="IDLINEA" precision="8" scale="0" not-null="true" />
            </key>
            <one-to-many class="com.shs.datada.entity.TExcepcionVehiculo" />
        </set>
    </class>
</hibernate-mapping>
Código:
<?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 09-abr-2015 12:39:36 by Hibernate Tools 4.3.1 -->
<hibernate-mapping>
    <class name="com.shs.datada.entity.TPerfilDemanda" table="T_PERFIL_DEMANDA" schema="DATADA" optimistic-lock="version">
        <composite-id name="id" class="com.shs.datada.entity.TPerfilDemandaId">
            <key-property name="idempresa" type="int">
                <column name="IDEMPRESA" precision="8" scale="0" />
            </key-property>
            <key-property name="idperfildemanda" type="int">
                <column name="IDPERFILDEMANDA" precision="8" scale="0" />
            </key-property>
        </composite-id>
        <many-to-one name="TLinea" class="com.shs.datada.entity.TLinea" update="false" insert="false" fetch="select">
            <column name="IDEMPRESA" precision="8" scale="0" not-null="true" />
            <column name="IDLINEA" precision="8" not-null="true" />
        </many-to-one>
        <property name="descripcion" type="string">
            <column name="DESCRIPCION" length="50" not-null="true" />
        </property>
        <property name="factorcorrecciondemanda" type="short">
            <column name="FACTORCORRECCIONDEMANDA" precision="3" scale="0" not-null="true" />
        </property>
        <set name="TTramoHorarios" table="T_TRAMO_HORARIO" inverse="true" lazy="true" fetch="select">
            <key>
                <column name="IDEMPRESA" precision="8" scale="0" not-null="true" />
                <column name="IDPERFILDEMANDA" precision="8" scale="0" not-null="true" />
            </key>
            <one-to-many class="com.shs.datada.entity.TTramoHorario" />
        </set>
    </class>
</hibernate-mapping>

Muchísimas gracias!

Un saludo!
  #2 (permalink)  
Antiguo 10/04/2015, 02:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Error en insert con hibernate

OFF TOPIC en Oracle.
Es tema de programación. Leer las reglas de cada subforo, por favor.

Movido a foro de Java.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 10/04/2015, 03:41
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Error en insert con hibernate

Cita:
Estado HTTP 500 - Request processing failed; nested exception is org.hibernate.exception.ConstraintViolationExcepti on: could not execute statement
java.sql.SQLIntegrityConstraintViolationException: ORA-01400: no se puede realizar una inserción NULL en ("DATADA"."T_PERFIL_DEMANDA"."IDLINEA")
El error es claro y preciso.

Tienes una restriccion not null para el campo IDLINEA. Sin embargo estas intentando guardar un null.
Seguramente no estas poblando correctamente el objecto.

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #4 (permalink)  
Antiguo 10/04/2015, 03:54
 
Fecha de Ingreso: febrero-2013
Ubicación: Sevilla
Mensajes: 5
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Error en insert con hibernate

Cita:
Iniciado por Profesor_Falken Ver Mensaje
El error es claro y preciso.

Tienes una restriccion not null para el campo IDLINEA. Sin embargo estas intentando guardar un null.
Seguramente no estas poblando correctamente el objecto.

Un saludo
Muchas gracias por la respuesta, pero eso fue lo primero que miré, y depurando vi que iba cargado, no obstante también probé a cargar los datos a mano en vez de recuperarlos de la BBDD y seguía dándome el mismo error:

Código:
Session session = HibernateUtil.getSessionFactory().openSession();
session.getTransaction().begin();
TEmpresa e = new TEmpresa(2, "insert de prueba", " ");
        
TPerfilDemandaId pId = new TPerfilDemandaId(1,50);

TLineaId id = new TLineaId(1, 1);
TEstacionId estId = new TEstacionId(1, 1);
TEstacion est = new TEstacion(estId, e, "estac", " ", " ");
TTipoLineaId tipolid = new TTipoLineaId(1, 1);
TTipoLinea tipolin = new TTipoLinea(tipolid, e, "Regular");
TLinea linea = new TLinea(id, est, tipolin, "lin", 50, " ", 1, " ", " ", true, true);
TPerfilDemanda p = new TPerfilDemanda(pId, linea, "Insert de prueba", (short)0);
        
session.saveOrUpdate(p);
session.getTransaction().commit();
session.close();

Última edición por dasensio; 10/04/2015 a las 04:04
  #5 (permalink)  
Antiguo 10/04/2015, 06:01
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Error en insert con hibernate

Y porque tienes en la relacion un update="false" insert="false"?

Un saludo
__________________
If to err is human, then programmers are the most human of us
  #6 (permalink)  
Antiguo 10/04/2015, 06:03
 
Fecha de Ingreso: febrero-2013
Ubicación: Sevilla
Mensajes: 5
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Error en insert con hibernate

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Y porque tienes en la relacion un update="false" insert="false"?

Un saludo
Porque me los creó automáticamente así al crear los POJOS, pero los he intentado cambiar y me da un error de mapeo.
  #7 (permalink)  
Antiguo 16/04/2015, 01:50
 
Fecha de Ingreso: febrero-2013
Ubicación: Utrera
Mensajes: 9
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Error en insert con hibernate

Hola Dámaso, pinta los POJOs TPerfilDemanda y TLinea, tiene pinta que no se esté asignando correctamente un Tlinea en la construcción del TPerfilDemanda
  #8 (permalink)  
Antiguo 16/04/2015, 09:58
 
Fecha de Ingreso: marzo-2015
Mensajes: 45
Antigüedad: 9 años, 1 mes
Puntos: 2
Respuesta: Error en insert con hibernate

Hola...

Que como bien dicen te falta un valor por asignar, eso significa que posiblemente no estas llegando todos los objetos que corresponden a esa tabla; es decir, si tienes un Objeto A y este tiene una relación con un Objeto B, entonces necesitas llegar primeramente el Objeto B correspondiente para posteriormente pasarlo al Objeto A y así realizar la inserción de datos con ambos objetos llenos.

Cualquier duda y/o comentario, aquí estamos. Suerte!

Etiquetas: clave, hibernate, insert, oracle, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:16.