Diferencia entre revisiones de «Practicas con Hibernate»

De Dos Ideas.
Saltar a: navegación, buscar
(Entidades)
(Uno a Muchos)
 
(No se muestran 8 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
En este apartado mostraremos diferentes ejemplos de uso de hibernate, usando de prueba un proyecto [[Hibernate Annotations con Spring | con hibernate más spring]]
+
En este apartado mostraremos diferentes ejemplos de uso de hibernate, usando de prueba un proyecto que utiliza [[Hibernate Annotations con Spring | hibernate y spring]], que podemos descargar del repositorio de google [http://code.google.com/p/dosideas-aplicaciones-modelo/source/browse/#svn%2Fhibernate-sandbox%2Ftrunk aquí]
  
 
== Cardinalidad entre entidades ==  
 
== Cardinalidad entre entidades ==  
Línea 58: Línea 58:
 
</code>
 
</code>
 
Con la siguiente anotaci&oacute;n decimos que el corazon esta relacionado uno a uno con el cuerpo y la existencia de este &uacute;ltimo es obligatoria ('''optional=false''').
 
Con la siguiente anotaci&oacute;n decimos que el corazon esta relacionado uno a uno con el cuerpo y la existencia de este &uacute;ltimo es obligatoria ('''optional=false''').
Adem&acute;s en caso de que este relacionado por una FK, definimos que el Join, lo realice utilizando esta columna.
+
Adem&aacute;s, en caso de que este relacionado por una FK, definimos que el Join, lo realice utilizando la FK.
 
<code java>
 
<code java>
 
     @OneToOne(optional=false)
 
     @OneToOne(optional=false)
Línea 64: Línea 64:
 
             name="cuerpoId", unique=true, nullable=false, updatable=false)
 
             name="cuerpoId", unique=true, nullable=false, updatable=false)
 
     private Cuerpo cuerpo;
 
     private Cuerpo cuerpo;
 +
</code>
 +
 +
==== DAO ====
 +
'''CuerpoDao'''
 +
<code java>
 +
@Repository
 +
@Transactional
 +
public class CuerpoDaoImpl implements CuerpoDao {
 +
 +
    @Autowired
 +
    private SessionFactory sessionFactory;
 +
   
 +
    public Cuerpo buscarPorId(Long id) {
 +
        return (Cuerpo) sessionFactory.getCurrentSession().get(Cuerpo.class, id);
 +
    }
 +
 +
    public void guardar(Cuerpo cuerpo) {
 +
        sessionFactory.getCurrentSession().save(cuerpo);           
 +
    }
 +
 +
    public void eliminar(Cuerpo cuerpo) {
 +
        sessionFactory.getCurrentSession().delete(cuerpo);
 +
    }
 +
 +
}
 +
</code>
 +
'''Nota:''' Dado que en los ejemplos solamente estamos analizando la capa de Dao's, los anotaremos como '''@Transactional''' para que cada m&eacute;todo finalice su transacci&oacute;n y faciliten los test.
 +
 +
=== Uno a Muchos ===
 +
==== Entidades ====
 +
Ej.: Una persona con muchos apodos
 +
 +
'''Persona'''
 +
<code java5>
 +
@Entity
 +
@Table(name = "Persona", schema = "UnoAMuchos")
 +
public class Persona {
 +
    @Id
 +
    @GeneratedValue(strategy = GenerationType.IDENTITY)
 +
    @Column(name = "personaId")
 +
    private Long id;
 +
   
 +
    /**
 +
    * descripcion
 +
    */
 +
    @Column(name = "personaNombre")
 +
    private String nombre;
 +
 
 +
    @OneToMany(cascade=CascadeType.ALL, mappedBy="persona")
 +
    private Collection<Apodo> apodos;
 +
    //Getter and Setter
 +
    ...
 +
}
 +
</code>
 +
 +
Con la siguiente anotaci&oacute;n decimos que la persona posee una colecci&oacute;n de apodos, y cada apodo esta relacionada a la persona mediante el atributo persona.
 +
<code java>
 +
@OneToMany(cascade=CascadeType.ALL, mappedBy="persona")
 +
private Collection<Apodo> apodos;
 +
</code>
 +
 +
 +
'''Persona'''
 +
<code java5>
 +
@Entity
 +
@Table(name = "Apodo", schema = "UnoAMuchos")
 +
public class Apodo {
 +
    @Id
 +
    @GeneratedValue(strategy = GenerationType.IDENTITY)
 +
    @Column(name = "apodoId")
 +
    /**
 +
    * Identificador del apodo.
 +
    */
 +
    private Long id;
 +
 +
    /**
 +
    * descripcion
 +
    */
 +
    @Column(name = "apodoDescripcion")
 +
    private String descripcion;
 +
   
 +
    @ManyToOne
 +
    @JoinColumn(name = "personaId")
 +
    private Persona persona;
 +
 +
    //Getter and Setter
 +
    ...
 +
}
 +
</code>
 +
 +
Con la siguiente anotaci&oacute;n decimos que el apodo pertenece al la entidad persona, y es uno de muchos apodos que puede tener la persona.
 +
<code java>
 +
@OneToMany(cascade=CascadeType.ALL, mappedBy="persona")
 +
private Collection<Apodo> apodos;
 
</code>
 
</code>
  
Línea 70: Línea 164:
 
* [[Hibernate Con Spring]]
 
* [[Hibernate Con Spring]]
 
* [[Hibernate Annotations con Spring]]
 
* [[Hibernate Annotations con Spring]]
 +
* [http://code.google.com/p/dosideas-aplicaciones-modelo/source/browse/#svn%2Fhibernate-sandbox%2Ftrunk Ejemplos de hibernate]

Revisión actual del 12:59 12 abr 2012

En este apartado mostraremos diferentes ejemplos de uso de hibernate, usando de prueba un proyecto que utiliza hibernate y spring, que podemos descargar del repositorio de google aquí

Cardinalidad entre entidades

Uno a Uno

Entidades

Ej.: Un cuerpo esta compuesto por un corazón

Cuerpo @Entity @Table(name = "Cuerpo", schema = "UnoAUno") public class Cuerpo {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "cuerpoId")
   private Long id;
   @Column(name = "cuerpoDescripcion")
   private String descripcion;
   
   @OneToOne(mappedBy = "cuerpo", cascade = CascadeType.ALL)
   private Corazon corazon;
  
   //Getter and Setter
   ...

}

Con la siguiente anotación decimos que el cuerpo posee una relación con la entidad corazón; y en la entidad corazón la relación esta dado por el atributo cuerpo. @OneToOne(mappedBy = "cuerpo", cascade = CascadeType.ALL) private Corazon corazon;

Corazón @Entity @Table(name = "Corazon", schema = "UnoAUno") public class Corazon {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "corazonId")
   private Long id;
   @OneToOne(optional=false)
   @JoinColumn(
           name="cuerpoId", unique=true, nullable=false, updatable=false)
   private Cuerpo cuerpo;
   @Column(name = "corazonDescripcion")
   private String descripcion;
   //Getter and Setter
   ...

} Con la siguiente anotación decimos que el corazon esta relacionado uno a uno con el cuerpo y la existencia de este último es obligatoria (optional=false). Además, en caso de que este relacionado por una FK, definimos que el Join, lo realice utilizando la FK.

   @OneToOne(optional=false)
   @JoinColumn(
           name="cuerpoId", unique=true, nullable=false, updatable=false)
   private Cuerpo cuerpo;

DAO

CuerpoDao @Repository @Transactional public class CuerpoDaoImpl implements CuerpoDao {

   @Autowired
   private SessionFactory sessionFactory;
   
   public Cuerpo buscarPorId(Long id) {
       return (Cuerpo) sessionFactory.getCurrentSession().get(Cuerpo.class, id);
   }
   public void guardar(Cuerpo cuerpo) {
       sessionFactory.getCurrentSession().save(cuerpo);            
   }
   public void eliminar(Cuerpo cuerpo) {
       sessionFactory.getCurrentSession().delete(cuerpo);
   }

} Nota: Dado que en los ejemplos solamente estamos analizando la capa de Dao's, los anotaremos como @Transactional para que cada método finalice su transacción y faciliten los test.

Uno a Muchos

Entidades

Ej.: Una persona con muchos apodos

Persona @Entity @Table(name = "Persona", schema = "UnoAMuchos") public class Persona {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "personaId")
   private Long id;
   
   /**
    * descripcion
    */
   @Column(name = "personaNombre")
   private String nombre;
  
   @OneToMany(cascade=CascadeType.ALL, mappedBy="persona")
   private Collection<Apodo> apodos;
   //Getter and Setter
   ...

}

Con la siguiente anotación decimos que la persona posee una colección de apodos, y cada apodo esta relacionada a la persona mediante el atributo persona. @OneToMany(cascade=CascadeType.ALL, mappedBy="persona") private Collection<Apodo> apodos;


Persona @Entity @Table(name = "Apodo", schema = "UnoAMuchos") public class Apodo {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "apodoId")
   /**
    * Identificador del apodo.
    */
   private Long id;
   /**
    * descripcion
    */
   @Column(name = "apodoDescripcion")
   private String descripcion;
   
   @ManyToOne
   @JoinColumn(name = "personaId")
   private Persona persona;
   //Getter and Setter
   ...

}

Con la siguiente anotación decimos que el apodo pertenece al la entidad persona, y es uno de muchos apodos que puede tener la persona. @OneToMany(cascade=CascadeType.ALL, mappedBy="persona") private Collection<Apodo> apodos;

Ver también