Obtener datos de dos o más tablas con Hibernate
Publicado por Maverick (2 intervenciones) el 21/05/2009 03:57:59
Buen día soy nuevo en Hibernate y he logrado construir un aplicativo que obtiene datos de una tabla llamada Libros en web usando hibernate con JSP, por lo que he configurado Hibernate, mapeado mi tabla con XML, y todo hasta el momento funciona perfecto, la única duda que tengo para terminar de comprender generalmente hibernate es cómo le hago para obtener información de dos tablas?. Me explicaré mejor:
He agregado una segunda tabla llamada Editorial que contiene dos campos, la primary key "cveedi" y la descripción de la tabla "edides" a manera de catálogo, y Libros tiene una llave foranea hacia Editorial lo cual genera una relación muchos a uno, varios libros pueden tener un editorial, actualmente los xml de ambas tablas son como sigue:
Libro.hbm.xml:
<!DOCTYPE hibernate-mapping PUBLIC "-//hibernate/hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package = "tutorial">
<class name="tutorial.Libro" table="LIBRO">
<id name="cvelib" column="CVELIB" type="long">
<generator class="native"/>
</id>
<property name="titulo" type="string"/>
<property name="autor" type="string"/>
<many-to-one name = "cveedi" class = "tutorial.Editorial" column = "CVEEDI"/>
</class>
</hibernate-mapping>
Editorial.hbm.xml:
<!DOCTYPE hibernate-mapping PUBLIC "-//hibernate/hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package = "tutorial">
<class name="tutorial.Editorial" table="EDITORIAL">
<id name="cveedi" column="CVEEDI" type="long">
<generator class="native"/>
</id>
<property name="edides" type="string">
<column name="EDIDES" length="50" not-null="true" unique="true"/>
</property>
</class>
</hibernate-mapping>
Las clases son:
Libros.java
/**
* @title 'Proyecto de integración experimental de la capa de persistencia a aplicativos web java Fase 1.'
* @author M@verick
* @version 1.0
* @description 'Clase que contiene el mapeo de objetos de una tabla de MySQL'
* @date 28/april/2009
*/
//paquete propietario.
package tutorial;
/**
* @Class
* @description 'Declaración de clase principal'
* @table hibernate2.libro
*/
public class Libro {
/**
* @attributes
* @description 'Declaración de atributos'
*/
private long cvelib = 0;
private String titulo = "";
private String autor = "";
private Editorial cveedi;
/**
* @gettersSetters
* @description 'declaración de getters y setters'
*/
public long getCvelib() {
return cvelib;
}
public void setCvelib(long cvelib) {
this.cvelib = cvelib;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getAutor() {
return autor;
}
public void setAutor(String autor) {
this.autor = autor;
}
public Editorial getCveedi() {
return cveedi;
}
public void setCveedi(Editorial cveedi) {
this.cveedi = cveedi;
}
}//Final de clase principal
Y Editorial.java:
/**
* @title 'Proyecto de integración experimental de la capa de persistencia a aplicativos web java Fase 1.'
* @author M@verick
* @version 1.0
* @description 'Clase que contiene el mapeo de objetos de una tabla de MySQL'
* @date 7/mayo/2009
*/
//paquete propietario
package tutorial;
/**
* @Class
* @description 'Declaración de clase principal'
* @table hibernate2.editorial
*/
public class Editorial {
/**
* @attributes
* @description 'Declaración de atributos'
*/
private long cveedi = 0;
private String edides = "";
/**
* @gettersSetters
* @description 'declaración de getters y setters'
*/
public long getCveedi() {
return cveedi;
}
public void setCveedi(long cveedi) {
this.cveedi = cveedi;
}
public String getEdides() {
return edides;
}
public void setEdides(String edides) {
this.edides = edides;
}
}//Final de clase principal
he logrado obtener la información usando:
Iterator libroAndEditorial = session.createQuery("select libro.titulo, editorial.edides " +
"from Libro libro, Editorial editorial where libro.cveedi = editorial.cveedi").list().iterator();
while (libroAndEditorial.hasNext()) {
Object[] tuple = (Object[])libroAndEditorial.next();
String libro = (String) tuple[0];
String editorial = (String) tuple[1];
System.out.println("Libro = " + libro);
System.out.println("Editorial = " + editorial);
}
Pero creo que no estoy utilizando mucha de la capacidad de Hibernate... ya que como ven no estoy llenando en ningún momento las propiedades de las clases Libro y Editorial, en pocas palabras, creo que si he mapeado bien mis clases, debe de haber alguna manera de que ejecute un HQL de la forma "select Libro.titulo, Editorial.edides from Libro, Editorial"
y que Hibernate haga el join, me llene las propiedades que quiero y únicamente mandarlas a llamar con algo como: "libro.getTitulo();" y "editorial.getEdides();" Lo que pretendo es posible???
Les agradecería si alguien me puede orientar al respecto.
Gracias, espero alguien me pueda contestar a la brevedad...
Salu2.
He agregado una segunda tabla llamada Editorial que contiene dos campos, la primary key "cveedi" y la descripción de la tabla "edides" a manera de catálogo, y Libros tiene una llave foranea hacia Editorial lo cual genera una relación muchos a uno, varios libros pueden tener un editorial, actualmente los xml de ambas tablas son como sigue:
Libro.hbm.xml:
<!DOCTYPE hibernate-mapping PUBLIC "-//hibernate/hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package = "tutorial">
<class name="tutorial.Libro" table="LIBRO">
<id name="cvelib" column="CVELIB" type="long">
<generator class="native"/>
</id>
<property name="titulo" type="string"/>
<property name="autor" type="string"/>
<many-to-one name = "cveedi" class = "tutorial.Editorial" column = "CVEEDI"/>
</class>
</hibernate-mapping>
Editorial.hbm.xml:
<!DOCTYPE hibernate-mapping PUBLIC "-//hibernate/hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package = "tutorial">
<class name="tutorial.Editorial" table="EDITORIAL">
<id name="cveedi" column="CVEEDI" type="long">
<generator class="native"/>
</id>
<property name="edides" type="string">
<column name="EDIDES" length="50" not-null="true" unique="true"/>
</property>
</class>
</hibernate-mapping>
Las clases son:
Libros.java
/**
* @title 'Proyecto de integración experimental de la capa de persistencia a aplicativos web java Fase 1.'
* @author M@verick
* @version 1.0
* @description 'Clase que contiene el mapeo de objetos de una tabla de MySQL'
* @date 28/april/2009
*/
//paquete propietario.
package tutorial;
/**
* @Class
* @description 'Declaración de clase principal'
* @table hibernate2.libro
*/
public class Libro {
/**
* @attributes
* @description 'Declaración de atributos'
*/
private long cvelib = 0;
private String titulo = "";
private String autor = "";
private Editorial cveedi;
/**
* @gettersSetters
* @description 'declaración de getters y setters'
*/
public long getCvelib() {
return cvelib;
}
public void setCvelib(long cvelib) {
this.cvelib = cvelib;
}
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getAutor() {
return autor;
}
public void setAutor(String autor) {
this.autor = autor;
}
public Editorial getCveedi() {
return cveedi;
}
public void setCveedi(Editorial cveedi) {
this.cveedi = cveedi;
}
}//Final de clase principal
Y Editorial.java:
/**
* @title 'Proyecto de integración experimental de la capa de persistencia a aplicativos web java Fase 1.'
* @author M@verick
* @version 1.0
* @description 'Clase que contiene el mapeo de objetos de una tabla de MySQL'
* @date 7/mayo/2009
*/
//paquete propietario
package tutorial;
/**
* @Class
* @description 'Declaración de clase principal'
* @table hibernate2.editorial
*/
public class Editorial {
/**
* @attributes
* @description 'Declaración de atributos'
*/
private long cveedi = 0;
private String edides = "";
/**
* @gettersSetters
* @description 'declaración de getters y setters'
*/
public long getCveedi() {
return cveedi;
}
public void setCveedi(long cveedi) {
this.cveedi = cveedi;
}
public String getEdides() {
return edides;
}
public void setEdides(String edides) {
this.edides = edides;
}
}//Final de clase principal
he logrado obtener la información usando:
Iterator libroAndEditorial = session.createQuery("select libro.titulo, editorial.edides " +
"from Libro libro, Editorial editorial where libro.cveedi = editorial.cveedi").list().iterator();
while (libroAndEditorial.hasNext()) {
Object[] tuple = (Object[])libroAndEditorial.next();
String libro = (String) tuple[0];
String editorial = (String) tuple[1];
System.out.println("Libro = " + libro);
System.out.println("Editorial = " + editorial);
}
Pero creo que no estoy utilizando mucha de la capacidad de Hibernate... ya que como ven no estoy llenando en ningún momento las propiedades de las clases Libro y Editorial, en pocas palabras, creo que si he mapeado bien mis clases, debe de haber alguna manera de que ejecute un HQL de la forma "select Libro.titulo, Editorial.edides from Libro, Editorial"
y que Hibernate haga el join, me llene las propiedades que quiero y únicamente mandarlas a llamar con algo como: "libro.getTitulo();" y "editorial.getEdides();" Lo que pretendo es posible???
Les agradecería si alguien me puede orientar al respecto.
Gracias, espero alguien me pueda contestar a la brevedad...
Salu2.
Valora esta pregunta


0