eugeniaperez.es
Unidad 2: JPA VS. HIBERNATE
eugeniaperez.es
2.1 Java Persistence API
Java Persistence API (JPA) es la API de persistencia (javax.persistence) desarrollada para la plataforma Java EE. Es un framework que maneja datos relacionales en aplicaciones usando la Plataforma Java en sus ediciones Java SE y Java EE.
Conserva las ventajas de la OO al seguir el patrón de mapeo objeto-relacional y permitir usar POJOs.
eugeniaperez.es
2.1 Java Persistence API
eugeniaperez.es
2.2 Implementaciones de JPA
Existen muchas entre las cuáles Hibernate es la más usada. Destacan las siguientes:
El proveedor quién realiza el trabajo funcionando bajo la API de JPA.
eugeniaperez.es
2.3 Hibernate: implementación de JPA
Crearemos una entidad simple o POJO (@Entity):
eugeniaperez.es
2.3 Hibernate: implementación de JPA
Todas las entidades poseen una identidad que las diferencia del resto: @Id (Mejor Integer que int) Lo recomendable es Long
Para hacerla autogenerada: @GeneratedValue
Por defecto: las entidades serán mapeadas a una tabla de la BD del mismo nombre, y cada una de sus propiedades será mapeada a una columna con el mismo nombre también.
eugeniaperez.es
2.3 Hibernate: implementación de JPA
Por defecto las propiedades se leen tempranamente:
Pero es un comportamiento que se puede variar con la lectura demorada, para evitar el coste de crear la entidad si no se utiliza:
@Basic(fetch = FetchType.EAGER)
private Image banner;
@Basic(fetch = FetchType.LAZY)
private Image banner;
Se debe utilizar con moderación puesto que compromete el rendimiento
eugeniaperez.es
2.3 Hibernate: implementación de JPA
JPA puede mapear los tipos enumerados (enum) mediante la anotación @Enumerated:
Por defecto de JPA mapeará cada valor ordinal a una columna de tipo numérico en la base de datos:
Se puede variar para almacenar su nombre:
public class Film {
@Enumerated
private Genre genre;
...
public enum Genre {
HORROR,
DRAMA,
COMEDY,
ACTION
}
}
@Enumerated(EnumType.STRING)
private Genero genero;
eugeniaperez.es
2.3 Hibernate: implementación de JPA
Si no quiero almacenar alguna propiedad: @Transient. Por ejemplo, la edad de una Persona.
Su valor puede ser calculado en tiempo de ejecución gracias a la propiedad fechaNacimiento.
@Transient
private int age;
public int getAge() {
// workout the age and return it
}
@Entity
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
private String surname;
private Date dateOfBirth;
private int age;
// getters y setters
}
eugeniaperez.es
2.3 Hibernate: implementación de JPA
Los tipos insertables (embeddable types) son objetos que no tienen identidad, por lo que para ser persistidos deben ser primero insertados dentro de una entidad. Entidades débiles
Se declaran con @Embeddable:
@Embeddable
public class Address {
private String streetName;
private int postalCode;
// ...
}
@Entity
public class Person {
// ...
@Embedded
private Address address;
}
Se insertan con @Embbeded:
eugeniaperez.es
2.3 Hibernate: implementación de JPA
Es necesario ser coherente con el tipo de acceso:
El tipo de acceso que usará una entidad está definido por el lugar donde situemos sus anotaciones de mapeo.
Es necesario ser congruente, evitando mezclar los tipos.
2.3 Hibernate: implementación de JPA
@Entity
public class Entity
@Id
private Long id;
@Column(name="NAME")
private String name;
private int variable;
public Entity () {}
//getters and setters
@Column(name = "VALOR_DOBLE")
public int getVariable() {
return variable * 2;
}
public void setVariable(int variable) {
this.variable = variable;
}
}
eugeniaperez.es
2.3 Hibernate: implementación de JPA
Para evitar dichos problemas utilizaremos la anotación @Access
@Embeddable
@Access(AccessType.PROPERTY)
public class Insertable { ... }
@Embeddable
@Access(AccessType.FIELD)
public class Insertable { ... }
eugeniaperez.es
3.1 Archivos de configuración
La configuración de Hibernate puede hacerse en tres lugares:
Los archivos pueden tener cualquier nombre, pero Hibernate buscará por defecto los archivos con los nombres que he mencionado, en una ubicación predeterminada
eugeniaperez.es
Descarga en Bitbucket
Descarga el proyecto jpaExample del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/jpaexample.git
eugeniaperez.es
FIN DE LA UNIDAD 2: JPA VS. HIBERNATE
eugeniaperez.es
Unidad 3: Configuración de hibernate
eugeniaperez.es
3.1 Archivos de configuración
La configuración de Hibernate puede hacerse en tres lugares:
Los archivos pueden tener cualquier nombre, pero Hibernate buscará por defecto los archivos con los nombres que he mencionado, en una ubicación predeterminada
eugeniaperez.es
3.2 El archivo hibernate.cfg.xml
El contenido mínimo:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
</hibernate-configuration>
eugeniaperez.es
3.2 El archivo hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property
name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property
name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property
name="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="connection.username">test</property>
<property name="connection.password">test</property>
<property name="hibernate.show_sql">true</property>
<property name="hbm2ddl.auto">create-drop</property>
</session-factory>
</hibernate-configuration>
eugeniaperez.es
3.2 El archivo hibernate.cfg.xml
eugeniaperez.es
3.2 El archivo hibernate.cfg.xml
<mapping resource="mappings/Customer.hbm.xml"/>
Una vez que construyas el fichero cfg.xml lo ubicarás en la carpeta resources.
eugeniaperez.es
FIN DE UNIDAD 3: Configuración de Hibernate
eugeniaperez.es
Unidad 4: Mapeo de clases persistentes