Practicas con Hibernate
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í
Contenido
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;