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

Problema con HIBERNATE

Estas en el tema de Problema con HIBERNATE en el foro de Java en Foros del Web. Saludo a todos, no se si precisamente esto debiera ir aqui o en BD, pero ya esta hecho. Paso a explicarles.... estoy desarrollando una aplicacion ...
  #1 (permalink)  
Antiguo 17/05/2010, 11:48
Avatar de alguienmas  
Fecha de Ingreso: mayo-2009
Mensajes: 62
Antigüedad: 14 años, 11 meses
Puntos: 8
Problema con HIBERNATE

Saludo a todos, no se si precisamente esto debiera ir aqui o en BD, pero ya esta hecho. Paso a explicarles.... estoy desarrollando una aplicacion en JAVA y he aprobechado de experimentar con HIBERNATE( es un ORM para JAVA). Bueno he tenido problemas pero de a poco los voy superando... pero me he topad[o con un problema algo raro por como se produce, les explico:

MER: tengo una tabla llamada lugar_de_trabajo esta tabla tiene una relacion 1:N
con ella misma es algo asi
--------------------------
| lugar_de_trabajo |
--------------------------
| codigo (PK) |
| ubicado (FK) |
| nombre |
--------------------------

La PK se genera autoincremental desde el mapeo de hibernate, bueno hasta ahi no hay problema, ahora explico el problema. Sucede que este lugar de trabajo puede ser una FAENA o una MAQUINA (estos son CLASES en la implementacion). FAENA son cuando NO tienen (FK) osea ubicado es NULL y lo contrario para las MAQUINA es decir cuando ubicado tiene valor. Las clases serian algo asi:

-------------------------------------
| Faena
-------------------------------------
| int codigo;
| String nombre;
| List<Maquina> maq;
-------------------------------------
| gets and sets.....
-------------------------------------


-------------------------------
| Maquina
-------------------------------
| int codigo;
| String nombre;
| Faena faena;
-------------------------------
| gets and sets.....
-------------------------------


Al probarlo me he dado cuenta que al crear una FAENA y luego asignarle dos MAQUINA, al tratar de guardarlo me arroja error, de que se repite la PK. Esto se debe a que la primera MAQUINA toma el mismo codigo que la primera FAENA(para caso de la prueba era solo una faena y dos maquinas) y eso pasa por ser clases distintas y ocupar mapeos distintos.... es decir hibernate se encarga de buscar el valor mayor de la PK, en este caso codigo, y para settear el valor del codigo de la faena nueva, le suma 1 y lo mismo sucede al crear una maquina, por lo que crea el mismo codigo para ambos objetos. Finalmente la pregunta es posible solucionar esto o se debe de realizar de otra forma? cual?

adjunto los codigo y mapeos.

Clase MAQUINA
Código:
public class Maquina extends ConexionHibernate implements Serializable {

    private int codigo;
    private String nombre;
    private String tipo;
    private Faena ubicado;
    // CONSTRUCTORES

    public Maquina() {
        this.tipo="Maquina";
    }

    public Maquina(String nombre) {
        this.nombre = nombre;
        this.tipo = "Maquina";
    }

    public int getCodigo() {
        return codigo;
    }

    private void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public String getNombre() {
        return nombre;
    }

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

    public String getTipo() {
        return tipo;
    }

    private void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public Faena getUbicado() {
        return ubicado;
    }

    public void setUbicado(Faena ubicado) {

        this.ubicado = ubicado;
    }

    public int save() {
        return super.save(this);
    }

    public Faena getUbicacion(int id) {
        return ((Faena) super.getElemento(id));
    }

    public boolean update() {
        return update(this);
    }

    public boolean delete() {
        return super.delete(this);
    }
}

Clase FAENA
Código:
public class Faena extends ConexionHibernate implements Serializable {

    private int codigo;
    private String nombre;
    private String tipo;
    private List<Maquina> maquinas = new LinkedList<Maquina>();
    // CONSTRUCTORES

    public Faena() {
        this.tipo="Faena";
    }

    public Faena(String nombre) {
        this.nombre = nombre;
        this.tipo="Faena";
    }

    public int getCodigo() {
        return codigo;
    }

    private void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public String getNombre() {
        return nombre;
    }

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

    public String getTipo() {
        return tipo;
    }

    private void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public void addMaquina(Maquina maq){
        this.maquinas.add(maq);
        maq.setUbicado(this);
    }

    public List<Maquina> getMaquinas(){
        return maquinas;
    }

    public void setMaquinas(List<Maquina> maquinas){
        this.maquinas = maquinas;
    }

    public int save() {
        return super.save(this);
    }

    public boolean update() {
        return update(this);
    }

    public boolean delete() {
        return super.delete(this);
    }
    public Faena getFaena(int id) throws Exception
    {
        Faena f = (Faena)super.getElemento(id);
        if(f == null)
            throw new Exception("No Se Encontro Faena");
        else if( !f.getTipo().equalsIgnoreCase("Faena") )
            throw new Exception("No Es Faena El Codigo");
        return f;
    }
}
Clase CONEXIONHIBERNATE
Código:
class ConexionHibernate {
    public static Session sesion;
    public static Transaction tx;
    public static void iniciaOperacion() throws HibernateException
    { 
        sesion = HibernateUtil.getSessionFactory().openSession();
        tx = sesion.beginTransaction(); 
    }
    public void manejaExcepcion(HibernateException he) throws HibernateException
    { 
        tx.rollback();
        he.printStackTrace();
        //throw new HibernateException("Ocurrió un error en la capa de acceso a datos", he);

    }
     public Object getElemento(int codigo)
    {
        Object obj = null;
        try
        {
            ConexionHibernate.iniciaOperacion();
            obj = ConexionHibernate.sesion.get(this.getClass(), codigo);
        } finally
        {
            ConexionHibernate.sesion.close();
        }
        return obj;
    }
    public int save(Object t)
    {
        long id = 0;
        try
        {
            ConexionHibernate.iniciaOperacion();
            ConexionHibernate.sesion.saveOrUpdate(t);
            ConexionHibernate.tx.commit();
            id = (Integer)ConexionHibernate.sesion.getIdentifier(t);
            //id = (Integer)ConexionHibernate.sesion.save(t);
        }catch(HibernateException he)
        {
            this.manejaExcepcion(he);
            throw he;
        }catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            ConexionHibernate.sesion.close();
        }
        return (int)id;
    }
    public boolean update(Object t)
    {
        boolean ret = false;
        try
        {
            ConexionHibernate.iniciaOperacion();
            ConexionHibernate.sesion.update(t);
            ConexionHibernate.tx.commit();
            ret = true;
        }catch (HibernateException he)
        {
            this.manejaExcepcion(he);
            throw he;
        }finally
        {
            ConexionHibernate.sesion.close();
        }
        return ret;
    }
    public boolean delete(Object t)
    {
        boolean ret = false;
        try
        {
            ConexionHibernate.iniciaOperacion();
            ConexionHibernate.sesion.delete(t);
            ConexionHibernate.tx.commit();
            ret=true;
        } catch (HibernateException he)
        {
            this.manejaExcepcion(he);
            throw he;
        }finally
        {
            ConexionHibernate.sesion.close();
        }
        return ret;
    }

}
Mapeo Faena
Código:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="ClasesBases.Faena" table="lugar_trabajo">
    <id column="codigo" name="codigo">
      <generator class="increment"/>
    </id>
    <property column="nombre" name="nombre" type="string"/>
    <property column="tipo" name="tipo" type="string"/>    
    <list name="maquinas" lazy="false" cascade="none" >
      <key column="ubicado_codigo"/>
      <index column="codigo"/>
      <one-to-many class="ClasesBases.Maquina"/>
    </list>
  </class>
</hibernate-mapping>
Mapeo Maquina
Código:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="ClasesBases.Maquina" table="lugar_trabajo">
    <id column="codigo" name="codigo">
      <generator class="increment"/>
    </id>
    <property column="nombre" name="nombre" type="string"/>
    <property column="tipo" name="tipo" type="string"/>
    <many-to-one name="ubicado" column="ubicado_codigo"  />
  </class>
</hibernate-mapping>
Disculpen lo extenso, pero trate de explicarme lo mejor posible.

Última edición por alguienmas; 18/05/2010 a las 07:10 Razón: [Solucionado]
  #2 (permalink)  
Antiguo 17/05/2010, 22:14
Avatar de dackiller  
Fecha de Ingreso: septiembre-2003
Ubicación: The Matrix
Mensajes: 341
Antigüedad: 20 años, 7 meses
Puntos: 4
Respuesta: Problema con HIBERNATE

Hola, creo que el problema que tienes es que UBICACION, es un campo que usas para crear la relacion, por ende no puede ser null.

HibernateTools de eclipse ayuda muchisimo a minimizar tiempo en generar archivo de mapeo.

Creo que deberias re-estructurar la Base de Datos, nuevamente.

Saludos
__________________
--
NOTA: Si haz conseguido la solución a tu problema, por favor edita el titulo del tema colocando el prefijo [SOLUCIONADO], para que otros usuarios puedan encontrar soluciones más rápido.
  #3 (permalink)  
Antiguo 18/05/2010, 07:09
Avatar de alguienmas  
Fecha de Ingreso: mayo-2009
Mensajes: 62
Antigüedad: 14 años, 11 meses
Puntos: 8
Respuesta: Problema con HIBERNATE

Gracias dackiller, pero solucione esto de otra forma. Primero me tube que cambiar el generador de PK a "native" para que la clave (en este caso codigo) la genere el motor de BD y no hibernate, esto lo hice en ambos mapeos y segundo tube que agregar un campo extra a la tabla llamado orden donde almacena el orden en que estan los elementos en la lista para el mapeo de faena.

Espero esto le sirva a alguien, nuevamente gracias dackiller.

Etiquetas: hibernate, orm
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 19:00.