Obtener datos de dos tablas en Hibernate.

Tengo un problema con Hibernate al querer obtener datos de dos tablas. Te explico brevemente, Primero tengo dos tablas creadas en mysql una se llama Usuario y otra llamada Web donde la relación es de muchos a muchos por lo tanto rompo la relación creando una tabla UsuWeb.
Al momento de mapear el archivo map.hbm.xml lo hago de la sig forma:
<!-- Tabla de Usuario -->
        <class name="Usu" table="USU">
            <id name="cveusu" column="CVEUSU" type="integer">
                <generator class="increment"></generator>
            </id>
<property name="usuid" type="string" />
            <set name="Web" table="USUWEB" cascade="all">
                <key column="CVEUSU"/>
                <many-to-many class="Web" column="CVEWEB"/>
            </set>
        </class>
<!-- Tabla de Web -->
        <class name="Web" table="WEB">
            <id name="cveweb" column="CVEWEB" type="integer">
                <generator class="increment"></generator>
            </id>
<property name="webdes" type="string" />
            <set name="Usu" table="USUWEB" cascade="all">
                <key column="CVEWEB"/>
                <many-to-many class="Usu" column="CVEUSU"/>
            </set>
        </class>
Las clases son las siguientes:
public class Usu {
    private int cveusu = 0;
    private String usuid = "";
    private Set Gru = new HashSet();
//... GETTERS AND SETTERS
}
public class Web{
private int cveweb = 0;
private String webdes= "";
private Set Gru = new HashSet();
//... GETTERS AND SETTERS
}
Mi pregunta es: ¿Cómo le puedo hacer para obtener datos de la tabla Web mediante la tabla UsuWeb hacia la tabla usu si no tengo una variable directa a USUWEB en ninguna de las dos Tablas arriba descritas?

1 Respuesta

Respuesta
1
En el mapeo de usuario tienes la colección de webs de un usuario.
<set name="Web" table="USUWEB" cascade="all">
        <key column="CVEUSU"/>
        <many-to-many class="Web" column="CVEWEB"/>
</set>
Desde los usuarios puedes acceder a las web de cada usuario y desde las web puedes acceder a los usuarios de cada web. Así es como funciona los mapeos N:M.
No sé muy bien si esto te resuelve tu duda, si no es así especifica un poco más, por ejemplo con un ejemplito.
Ok. Mira lo que pasa es que yo obtengo los datos de las tablas de la siguiente manera:
Usu usuario = new Usu();
query = session.createQuery("from Usu where usuid =:u")
usuario.getUsuId();//aqui obtengo el Id del usuario
usuario.getCvePais().getPais();//aqui obtengo los datos de otra tabla relacionada a usuario por llave foranea uno a muchos
//el problema radica cuando quiero obtener los datos de la tabla web de esta manera:
usuario.getCVeUsu().getCveUsu().getCveWeb();//aqui marca error.
Como puedo obtener los datos de la tabla Web como lo hice con una tabla anterior.
Gracias por tu respuesta.
Saludos.
¿No seria de esta forma?
Usu usuario;
List<Usu> lista = query = session.createQuery("from Usu where usuid =:u").setString("u","CODIGO DE USUARIO").list();
usuario = lista.get(0);
Y ya tienes cargado en usuario el registro correspondiente al usuario con el CÓDIGO DE USUARIO y ya accedes a sus propiedades de esta manera:
Set listaWebs = listausuario.getGru();
personalmente yo utilizo para obtener el usuario esto:
Usu usuario = session.get(Usu.class,"CODIGO DE USUARIO");
Es mucho más limpio que la opción de arriba, pero te la tenia que poner para que lo vieras más claro.
Que tal experto primero que nada agradezco tus respuestas. Pero toda vía no puedo acceder a la tabla Web a través del usuario, disculpa si soy un poco lento en comprender pero son mis primeros pasos.
Ok de acuerdo a la sentencia que me pasaste me aparece un error de tipo "Type mismatch: cannot convert from Query to List<Usu>".
List<Usu> lista = query = session.createQuery("from Usu where usuid =:u").setString("u","CODIGO DE USUARIO").list();
 La manera en que se soluciona es de la siguiente manera:
List<Usu> lista = (List<Usu>) (query = (Query) session.createQuery("from Usu where usuid =:u").setString("u","CODIGO DE USUARIO").list());
No se si tenga que ver lo anterior con que no pueda entrar a la tabla de web ya que también me aparece un error en.
Set listaWebs = listaUsuario.getGru();
Ya que listaUsuario cannot be resolved.
Entonces, no se que estoy haciendo mal :¿s?
Gracias por tu atención. Saludos.
Prueba lo siguiente:
Usu usuario = session.get(Usu.class,"CODIGO DE USUARIO");
Con esto debes poder acceder a las propiedades del usuario con el código especificado. Luego si ese objeto está relleno, no vas a tener ningún problema a la hora de hacer esta asignación:
Set listaWebs = usuario.getGru();
Prueba con esto y si tienes problemas no dudes en contestar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas