Hibernate JPA
Hibernate JPA
JPA
Java ?
O.O. ?
Interfaces / Polimorfismo ?
Acoplamiento ?
JDBC ?
Patrones de Diseño ?
Singleton ?
Value Object ?
DAO ?
Frameworks ?
Atributos (complejos)
OBJETOS Métodos
Herencia
Esquemas
BBDD Filas
Tablas PK
Relacionales FK
Indices
IMPLEMENTACIONES JPA
Hibernate RedHat
Eclipselink Eclipse Foundation
Toplink Oracle
ObjectDB
CocoBase
OpenJPA Apache
Kodo Bea
Mapeo (Metadatos):
Anotaciones (Utiliza el estándar JPA)
Archivo de Configuración XML (HIBERNATE o JPA)
Aplicación
Objetos Persistentes
Hibernate
antlr-2.7.7.jar
archs
dom4j-1.6.1.jar
hibernate-commons-annotations-4.0.5.Final.jar
hibernate-core-4.3.7.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
jandex-1.1.0.Final.jar
javassist-3.18.1-GA.jar
jboss-logging-3.1.3.GA.jar
jboss-logging-annotations-1.2.0.Beta1.jar
jboss-transaction-api_1.2_spec-1.0.0.Final.jar
\hibernate-release-4.3.7.Final\lib\jpa\*
hibernate-entitymanager-4.3.7.Final.jar
<session-factory>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="hibernate.show_sql">true</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/curso_hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<mapping resource="persist-xml/introduccion/persona.hbm.xml"/>
</session-factory>
</hibernate-configuration>
<session-factory>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="hibernate.show_sql">true</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/curso_hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<mapping class="introduccion.Persona"/>
</session-factory>
</hibernate-configuration>
<mapping-file>persist-xml/introduccion/Persona.xml</mapping-file>
<properties>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.connection.pool_size" value="1" />
</persistence>
<properties>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.connection.pool_size" value="1" />
</persistence>
<hibernate-mapping>
<class name="introduccion.Persona">
<id name="idPersona" type="integer" />
<property name="apellidos" />
<property name="apodo" />
<property name="nombre" />
<property name="dni" />
</class>
</hibernate-mapping>
Todas las propiedades serán mapeadas a una tabla con el mismo nombre de la clase y cada
propiedad a una columna homónima
<hibernate-mapping>
<class name="introduccion.Persona">
<id name="idPersona" type="integer" />
<property name="apellidos" />
<property name="apodo" />
<property name="nombre" />
<property name="dni" />
</class>
</hibernate-mapping>
Todas las propiedades serán mapeadas a una tabla con el mismo nombre de la clase y cada
propiedad a una columna homónima
import java.io.Serializable;
import javax.persistence.*;
@Entity
public class Persona implements Serializable {
@Id
private int idPersona;
private String apellidos;
private String apodo;
private String nombre;
private String dni;
public Persona() {
}
import java.io.Serializable;
import javax.persistence.*;
@Entity
public class Persona implements Serializable {
@Id
private int idPersona;
private String apellidos;
private String apodo;
private String nombre;
private String dni;
public Persona() {
}
<description>
Mapeo minimo de una Entidad persistente
</description>
Todas las propiedades serán mapeadas a una tabla con el mismo nombre de la clase y cada
propiedad a una columna homónima
<description>
Mapeo minimo de una Entidad persistente
</description>
Todas las propiedades serán mapeadas a una tabla con el mismo nombre de la clase y cada
propiedad a una columna homónima
ServiceRegistry serviceRegistry;
serviceRegistry = new StandardServiceRegistryBuilder()…
sessionFactory =
configuration.buildSessionFactory(serviceRegistry);
SessionFactory session=sessionFactory.openSession();
Session . . .
session.close();
sessionFactory.close();
ServiceRegistry
Se obtiene de StandardServiceRegistryBuilder()
Configuration
.configure(String xml)
SessionFactory .buildSessionFactory(ServiceRegistry sr)
SessionFactory
Session .openSession()
session=sessionFactory.openSession();
session.beginTransaction();
session.save(p);
session.getTransaction().commit();
session.close();
sessionFactory.close();
emf =
Persistence.createEntityManagerFactory("ejemplos_curso");
em = emf.createEntityManager();
em.close();
emf.close();
EntityManagerFactory
EntityManager
Persistence
.createEntityManagerFactory(persistent_unit) EntityManagerFactory
EntityManagerFactory
.createEntityManager() EntityManager
em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
em.persist(mo);
tx.commit();
em.close();
emf.close();
EntityTransaction
• void begin()
• void commit()
• void rollback()
@Transient
Los atributos transient no se almacenan en la bbdd
@Transient
private int edad;
@Basic (optional=false)
El atributo no admite nulos
@Column (name = "p_dni")
@Basic (optional=false)
private String dni;
@Enumerated
@Column (name = "p_sexo")
private Sexo sexo;
Almacena el orden del valor
(cuidado con el cambio de orden)
@Column (name = "p_sexo")
private Sexo sexo;
@Enumerated (EnumType.STRING)
@Column (name = "p_sexo") Almacena el valor
private Sexo sexo;
@Embedded
public class Persona04 implements Serializable {
@Embedded
private Domicilio domicilio;
@Embeddable
@Embeddable
public class Domicilio implements Serializable{
@Embedded
public class Persona04 implements Serializable {
@Embedded
private Domicilio domicilio;
@Embeddable
@Embeddable
public class Domicilio implements Serializable{
@Entity
public class Persona implements Serializable {
Métodos private int idPersona;
getters private String apellidos;
…
@Id
PROPERTY public int getIdPersona() {
}
@Access(AccessType.PROPERTY)
@Access(AccessType.FIELD)
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="tipo_figura", discriminatorType=DiscriminatorType.STRING)
public abstract class Figura {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
int idFigura;
double x;
double y;
…
@Entity
@Entity
@DiscriminatorValue("RECTANGULO")
@DiscriminatorValue("CIRCULO")
public class Rectangulo extends Figura {
public class Circulo extends Figura {
double l1;
double r;
double l2;
…
…
@Entity
@Table (name = "figuras02")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Figura02 {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
int idFigura;
…
@Entity
@Entity @Table (name = "rectangulo_02")
@Table (name = "circulo_02") public class Rectangulo02 extends Figura02 {
public class Circulo02 extends Figura02 {
double r; double l1;
double l2;
@Entity
public class Domicilio {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int idDomicilio;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int idDomicilio;
@Entity
@Table (name = "contacto")
public class Contacto3{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int idContacto;
private String nombre;
…
@ElementCollection
@CollectionTable (name="telefonos", joinColumns = @JoinColumn (name = "idcontacto"))
@Column(name="telefono")
private List<String> telefonos;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int idpartido;
private String partido;
@ManyToOne
@JoinColumn (name = "idcampo")
@Entity
private Campo campo;
@Table(name="campos")
public class Campo implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int idcampo;
private String campo;
private String direccion;
@ManyToOne
@JoinColumn (name = "idequipo")
private Equipo02 equipo; @Entity
… @Table(name="equipos_02")
public class Equipo02 implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int idEquipo;
private String equipo;
@OneToMany (mappedBy="equipo")
private List<Partido02> partidos;
…
@ManyToMany
@JoinTable(name="equipos_jugadores_03"
, joinColumns={ @JoinColumn(name="IdEquipo")}
, inverseJoinColumns={@JoinColumn(name="idJugador")}))
private List<Jugador03> jugadores;
@Entity
@Table(name="jugadores_03")
public class Jugador03 implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int idJugador;
private String dorsal;
private String nombreYApellidos;
private String licencia;
@ManyToMany(mappedBy="jugadores")
Pablo López Grieco private List<Equipo03> equipos; 29/10/2015
JP QL
Permite realizar consultas sobre Objetos (no tablas)
Sintaxis similar a SQL
Por posición
…WHERE c.idContato = 1 AND c.algo = 2
q.setParameter(1, 107)
q.setParameter(2, “valor de algo”)
Por nombre
…WHERE c.idContato = :id AND c.algo = :algo…
q.setParameter(“id”, 107)
q.setParameter(“algo”, “su valor”)
UPDATE
UPDATE Contacto c SET c.nombre = ‘Pedro’
WHERE c.IdContacto =105
DELETE
DELETE FROM Contacto c WHERE c.idContacto = 107
TypedQuery q = em.createNamedQuery(“Contacto.findAll”,
Contacto.class);
List<Contacto> lista = q.getResultList();