Diferencia entre revisiones de «Ejemplo de tabla asociada a valores simples con Hibernate»

De ChuWiki
Saltar a: navegación, buscar
m
 
m
 
Línea 1: Línea 1:
 
== Introducción ==
 
== Introducción ==
  
Partiendo de [[Ejemplo sencillo con Hibernate]] y [[Ejemplo sencillo con asociaciones en Hibernate]], seguimos ahora añadiendo unos valores simples a una clase java. En concreto, haremos que nuestra clase Person tenga asociados varios String representando los e-mail de la persona.
+
Partiendo de [[Ejemplo sencillo con Hibernate]] y [[Ejemplo sencillo con asociaciones en Hibernate]], seguimos ahora añadiendo unos valores simples a una clase [[:Categoría:Java|java]]. En concreto, haremos que nuestra clase ''Person'' tenga asociados varios ''String'' representando los ''e-mail'' de la persona.
  
 
Aquí tienes disponibles todos los fuentes y ficheros de configuración de [http://code.google.com/p/chuidiang-ejemplos/source/browse/#svn/trunk/ejemplo-hibernate/src/main/java/com/chuidiang/ejemplos/hibernate/ejemplo3 este ejemplo con Hibernate].
 
Aquí tienes disponibles todos los fuentes y ficheros de configuración de [http://code.google.com/p/chuidiang-ejemplos/source/browse/#svn/trunk/ejemplo-hibernate/src/main/java/com/chuidiang/ejemplos/hibernate/ejemplo3 este ejemplo con Hibernate].
  
  
== Añadimos e-mail a la clase Person ==
+
== Añadimos ''e-mail'' a la clase ''Person'' ==
  
En nuestra clase Person sólo tenemos que añadir un Set de String, para guardar los e-mail. Ponemos además sus correspondientes métodos set() y get(). El método toString() lo modificamos para que muestre los datos de Person junto con todos sus e-mail.
+
En nuestra clase ''Person'' sólo tenemos que añadir un ''Set'' de ''String'', para guardar los ''e-mail''. Ponemos además sus correspondientes métodos ''setEmailAddresses()'' y ''getEmailAddresses()''. El método ''toString()'' lo modificamos para que muestre los datos de ''Person'' junto con todos sus ''e-mail''.
  
 
<pre>
 
<pre>
Línea 39: Línea 39:
  
  
== Fichero de mapeo de Person ==
+
== Fichero de mapeo de ''Person'' ==
  
Al fichero .hbm.xml correspondiente a la clase Person le añadimos una nueva etiqueta <set ...> para indicar este nuevo conjunto de posibles valores
+
Al fichero ''Person.hbm.xml'' correspondiente a la clase ''Person'' le añadimos una nueva etiqueta ''<set ...>'' para indicar este nuevo conjunto de posibles valores
  
 
<pre>
 
<pre>
 
...
 
...
   <set name="emailAddresses" table="PERSON_EMAIL_ADDR">
+
   <class name="com.chuidiang.ejemplos.hibernate.ejemplo3.Person"
      <key column="PERSON_ID" />
+
      table="PERSON">
      <element type="string" column="EMAIL_ADDR" />
+
  ...
  </set>
+
      <set name="emailAddresses" table="PERSON_EMAIL_ADDR">
 +
        <key column="PERSON_ID" />
 +
        <element type="string" column="EMAIL_ADDR" />
 +
    </set>
 +
  ...
 +
  </class>
 
...
 
...
 
</pre>
 
</pre>
  
* <set name="emailAddresses" ... : Indica el nombre del atributo en la clase Person
+
* ''<set name="emailAddresses" ...'' : Indica el nombre del atributo en la clase ''Person''
* <set ... table="PERSON_EMAIL_ADDR" : Indica la tabla de base de datos en la que queremos que se guarden las relaciones. Si no ponemos nombre de tabla, se usará el mismo valor que en name, es decir, emailAddresses.
+
* ''<set ... table="PERSON_EMAIL_ADDR"'' : Indica la tabla de base de datos en la que queremos que se guarden las relaciones. Si no ponemos nombre de tabla, se usará el mismo valor que en ''name'', es decir, ''emailAddresses''.
* <key column="PERSON_ID"/> : Indica la clave primaria de Person, que se usará también en esta nueva tabla.
+
* ''<key column="PERSON_ID"/>'' : Indica la clave primaria de ''Person'', que se usará también en esta nueva tabla.
* <element type="string" ... : Indica que los posibles valores son de tipo String. En el [[Ejemplo sencillo con asociaciones en Hibernate]] se asociaban dos clases (Person y Event) con cierta entidad cada una de ellas y, por eso, en vez de <element... se ponía <many-to-many.... Aquí, al ser un String un tipo simple, se pone <element...
+
* ''<element type="string" ...'' : Indica que los posibles valores son de tipo ''String''. En el [[Ejemplo sencillo con asociaciones en Hibernate]] se asociaban dos clases (''Person'' y ''Event'') con cierta entidad cada una de ellas y, por eso, en vez de ''<element...'' se ponía ''<many-to-many....'' Aquí, al ser un ''String'' un tipo simple, se pone ''<element...''
* <element ... column="EMAIL_ADDR" : Nombre para la columna con el tipo simple. Por supuesto, String no nos gusta como nombre de columna.
+
* ''<element ... column="EMAIL_ADDR"'' : Nombre para la columna con el tipo simple. Por supuesto, ''String'' no nos gusta como nombre de columna.
  
  
== Fichero de configuración de Hibernate ==
+
== Fichero de configuración de ''Hibernate'' ==
  
El fichero de configuración de Hibernate no tiene nada especial, es igual que en los dos ejemplos anteriores. En el enlace tienes el fichero completo [http://code.google.com/p/chuidiang-ejemplos/source/browse/trunk/ejemplo-hibernate/hibernate3.cfg.xml hibernate3.cfg.xml].
+
El fichero de configuración de ''Hibernate'' no tiene nada especial, es igual que en los dos ejemplos anteriores. En el enlace tienes el fichero completo [http://code.google.com/p/chuidiang-ejemplos/source/browse/trunk/ejemplo-hibernate/hibernate3.cfg.xml hibernate3.cfg.xml].
  
  
 
== El código de ejemplo ==
 
== El código de ejemplo ==
  
Necesitamos la clase [http://code.google.com/p/chuidiang-ejemplos/source/browse/trunk/ejemplo-hibernate/src/main/java/com/chuidiang/ejemplos/hibernate/ejemplo3/HibernateUtil.java HibernateUtil.java] al igual que en los ejemplos anteriores, donde se carga el fichero de configuración de Hibernate y se pone el código para establecer una SessionFactory única para toda la aplicación.
+
Necesitamos la clase [http://code.google.com/p/chuidiang-ejemplos/source/browse/trunk/ejemplo-hibernate/src/main/java/com/chuidiang/ejemplos/hibernate/ejemplo3/HibernateUtil.java HibernateUtil.java] al igual que en los ejemplos anteriores, donde se carga el fichero de configuración de ''Hibernate'' y se pone el código para establecer una ''SessionFactory'' única para toda la aplicación.
  
En el main() del código de Ejemplo3.java sólo insertaremos una persona en base de datos, luego le añadiremos el e-mail y finalmente haremos la consulta para mostrar lo insertado en pantalla. Puesto que la inserción y la consulta es igual que en el ejemplo anterior, vamos sólo con la parte de asociar un e-mail. Ese código está en un método  
+
En el ''main()'' del código de [http://code.google.com/p/chuidiang-ejemplos/source/browse/trunk/ejemplo-hibernate/src/main/java/com/chuidiang/ejemplos/hibernate/ejemplo3/Ejemplo3.java?r=6 Ejemplo3.java] sólo insertaremos una persona en base de datos, luego le añadiremos el ''e-mail'' y finalmente haremos la consulta para mostrar lo insertado en pantalla. Puesto que la inserción y la consulta es igual que en el ejemplo anterior, vamos sólo con la parte de asociar un ''e-mail''. Ese código está en un método  
  
 
<pre>
 
<pre>
Línea 93: Línea 98:
 
</pre>
 
</pre>
  
Símplemente se carga la Person llamando a session.load(), se le añade un e-mail con aPerson.getEmailAddresses().add(emailAddress) y basta hacer un session.getTransaction().commit() para que Hibernate detecte que aPerson tiene un e-mail nuevo y lo guarde en base de datos.
+
Simplemente se carga la ''Person'' llamando a ''session.load()'', se le añade un ''e-mail'' con ''aPerson.getEmailAddresses().add(emailAddress)'' y basta hacer un ''session.getTransaction().commit()'' para que ''Hibernate'' detecte que ''aPerson'' tiene un ''e-mail'' nuevo y lo guarde en base de datos.
  
  
 
[[Categoría:Hibernate]]
 
[[Categoría:Hibernate]]

Revisión actual del 20:35 11 feb 2009

Introducción

Partiendo de Ejemplo sencillo con Hibernate y Ejemplo sencillo con asociaciones en Hibernate, seguimos ahora añadiendo unos valores simples a una clase java. En concreto, haremos que nuestra clase Person tenga asociados varios String representando los e-mail de la persona.

Aquí tienes disponibles todos los fuentes y ficheros de configuración de este ejemplo con Hibernate.


Añadimos e-mail a la clase Person

En nuestra clase Person sólo tenemos que añadir un Set de String, para guardar los e-mail. Ponemos además sus correspondientes métodos setEmailAddresses() y getEmailAddresses(). El método toString() lo modificamos para que muestre los datos de Person junto con todos sus e-mail.

...
public class Person {
    ...
    private Set emailAddresses = new HashSet();

    public Set getEmailAddresses() {
        return emailAddresses;
    }

    public void setEmailAddresses(Set emailAddresses) {
        this.emailAddresses = emailAddresses;
    }
    ...
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("Persona: " + id + " - " + firstname + " - " + lastname
                + " - " + age);
        Iterator<String> direcciones = getEmailAddresses().iterator();
        while (direcciones.hasNext())
            sb.append(System.getProperty("line.separator") + "   e-mail : "
                    + direcciones.next());
        return sb.toString();
    }

}


Fichero de mapeo de Person

Al fichero Person.hbm.xml correspondiente a la clase Person le añadimos una nueva etiqueta <set ...> para indicar este nuevo conjunto de posibles valores

...
   <class name="com.chuidiang.ejemplos.hibernate.ejemplo3.Person"
      table="PERSON">
   ...
      <set name="emailAddresses" table="PERSON_EMAIL_ADDR">
         <key column="PERSON_ID" />
         <element type="string" column="EMAIL_ADDR" />
     </set>
   ...
   </class>
...
  • <set name="emailAddresses" ... : Indica el nombre del atributo en la clase Person
  • <set ... table="PERSON_EMAIL_ADDR" : Indica la tabla de base de datos en la que queremos que se guarden las relaciones. Si no ponemos nombre de tabla, se usará el mismo valor que en name, es decir, emailAddresses.
  • <key column="PERSON_ID"/> : Indica la clave primaria de Person, que se usará también en esta nueva tabla.
  • <element type="string" ... : Indica que los posibles valores son de tipo String. En el Ejemplo sencillo con asociaciones en Hibernate se asociaban dos clases (Person y Event) con cierta entidad cada una de ellas y, por eso, en vez de <element... se ponía <many-to-many.... Aquí, al ser un String un tipo simple, se pone <element...
  • <element ... column="EMAIL_ADDR" : Nombre para la columna con el tipo simple. Por supuesto, String no nos gusta como nombre de columna.


Fichero de configuración de Hibernate

El fichero de configuración de Hibernate no tiene nada especial, es igual que en los dos ejemplos anteriores. En el enlace tienes el fichero completo hibernate3.cfg.xml.


El código de ejemplo

Necesitamos la clase HibernateUtil.java al igual que en los ejemplos anteriores, donde se carga el fichero de configuración de Hibernate y se pone el código para establecer una SessionFactory única para toda la aplicación.

En el main() del código de Ejemplo3.java sólo insertaremos una persona en base de datos, luego le añadiremos el e-mail y finalmente haremos la consulta para mostrar lo insertado en pantalla. Puesto que la inserción y la consulta es igual que en el ejemplo anterior, vamos sólo con la parte de asociar un e-mail. Ese código está en un método

...
public class Ejemplo3 {
   ...
    private void addEmailToPerson(Long personId, String emailAddress) {

        // Comienza la sesión
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        // Se carga la persona de bd
        Person aPerson = (Person) session.load(Person.class, personId);

        // Se le asocia el e-mail
        aPerson.getEmailAddresses().add(emailAddress);

        // Y se salva en base de datos.
        session.getTransaction().commit();
    }
   ...
}

Simplemente se carga la Person llamando a session.load(), se le añade un e-mail con aPerson.getEmailAddresses().add(emailAddress) y basta hacer un session.getTransaction().commit() para que Hibernate detecte que aPerson tiene un e-mail nuevo y lo guarde en base de datos.