Ejemplo de tabla asociada a valores simples con Hibernate

De ChuWiki

Introducción[editar]

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[editar]

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[editar]

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[editar]

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[editar]

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.