m3-uf2 persistencia con hibernate
eugeniaperez.es
Unidad 2: JPA VS. HIBERNATE
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.
unidad 2: JPA VS. HIBERNATE
eugeniaperez.es
2.1 Java Persistence API
- JPA combina ideas y conceptos de los principales frameworks de persistencia, como Hibernate.
- El mapeo objeto-relacional se realiza mediante anotaciones
- Se utiliza un motor de persistencia para la traducción entre objetos-registros
- Para su configuración se utiliza persistence.xml ( hibernate.cfg.xml)
unidad 2: JPA VS. HIBERNATE
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.
unidad 2: JPA VS. HIBERNATE
eugeniaperez.es
2.3 Hibernate: implementación de JPA
Crearemos una entidad simple o POJO (@Entity):
- Con constructor por defecto
- Que sea clase de primer nivel (no interna)
- No sea final
- Implementar la interface java.io.Serializable
unidad 2: JPA VS. HIBERNATE
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.
- Es posible variar esto con @Table y @Column
unidad 2: JPA VS. HIBERNATE
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
unidad 2: JPA VS. HIBERNATE
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:
- Genre.COMEDY insertará el valor 2
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;
unidad 2: JPA VS. HIBERNATE
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
}
unidad 2: JPA VS. HIBERNATE
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:
unidad 2: JPA VS. HIBERNATE
eugeniaperez.es
2.3 Hibernate: implementación de JPA
Es necesario ser coherente con el tipo de acceso:
- Acceso a variable (field access)
- Acceso a propiedad (property access)
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.
unidad 2: JPA VS. HIBERNATE
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;
}
}
UNIDAD 2: JPA VS. HIBERNATE
eugeniaperez.es
2.3 Hibernate: implementación de JPA
Para evitar dichos problemas utilizaremos la anotación @Access
- Bien indicando acceso por propiedad: AccessType.PROPERTY
- O bien indicando acceso por variable: AccessType.FIELD
@Embeddable
@Access(AccessType.PROPERTY)
public class Insertable { ... }
@Embeddable
@Access(AccessType.FIELD)
public class Insertable { ... }
UNIDAD 3: CONFIGURACIÓN DE HIBERNATE
eugeniaperez.es
3.1 Archivos de configuración
La configuración de Hibernate puede hacerse en tres lugares:
- Un archivo de propiedades llamado "hibernate.properties"
- Un archivo XML llamado "hibernate.cfg.xml"
- En código dentro de la misma aplicación
Los archivos pueden tener cualquier nombre, pero Hibernate buscará por defecto los archivos con los nombres que he mencionado, en una ubicación predeterminada
unidad 1: arquitectura del orm
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
m3-uf2 persistencia con hibernate
eugeniaperez.es
FIN DE LA UNIDAD 2: JPA VS. HIBERNATE
m3-uf2 persistencia con hibernate
eugeniaperez.es
Unidad 3: Configuración de hibernate
UNIDAD 3: CONFIGURACIÓN DE HIBERNATE
eugeniaperez.es
3.1 Archivos de configuración
La configuración de Hibernate puede hacerse en tres lugares:
- Un archivo de propiedades llamado "hibernate.properties"
- Un archivo XML llamado "hibernate.cfg.xml"
- En código dentro de la misma aplicación
Los archivos pueden tener cualquier nombre, pero Hibernate buscará por defecto los archivos con los nombres que he mencionado, en una ubicación predeterminada
UNIDAD 3: CONFIGURACIÓN DE HIBERNATE
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>
UNIDAD 3: CONFIGURACIÓN DE HIBERNATE
eugeniaperez.es
3.2 El archivo hibernate.cfg.xml
- Configuraremos un session-factory y los parámetros de conexión:
<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>
UNIDAD 3: CONFIGURACIÓN DE HIBERNATE
eugeniaperez.es
3.2 El archivo hibernate.cfg.xml
- El valor de hbm2ddl.auto depende de la operación:
- validate: valida el schema, no hace cambios en la BD.
- update: actualiza el schema.
- create: crea el schema, destruyendo la información anterior.
- create-drop: elimina el schema al final de la sesión.
UNIDAD 3: CONFIGURACIÓN DE HIBERNATE
eugeniaperez.es
3.2 El archivo hibernate.cfg.xml
- Finalmente por cada fichero de mapeo se incluirá una línea con el elemento <mapping>:
<mapping resource="mappings/Customer.hbm.xml"/>
Una vez que construyas el fichero cfg.xml lo ubicarás en la carpeta resources.
m3-uf2 persistencia con hibernate
eugeniaperez.es
FIN DE UNIDAD 3: Configuración de Hibernate
m3-uf2 persistencia con hibernate
eugeniaperez.es
Unidad 4: Mapeo de clases persistentes
Unidad 2 y 3
By eugenia_perez
Unidad 2 y 3
- 1,259