domingo, 20 de mayo de 2012

Creación de una entidad en JPA

En este ejercicio se muestra la creación de una Entidad en JPA usando la base de datos SQLite y realizando operaciones de inserción y consulta.

Creacion de la tabla Persona
Creación de la clase Persona que representa a la tabla anteriormente mencionada
public class Persona {
 private int idPersona;
 private String nombre;
 private String apellidoPaterno;
 private String apellidoMaterno;
 private Date fechaNacimiento;

 //setters &aip; getters 
}
Como se puede observar es una clase plana con propiedades, setters y getters comunes. Para crear la entidad usaremos las anotaciones @Entity, @Table, @Id, @Column y @Temporal de la siguiente manera
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table (name="Persona")
public class Persona {
 
 @Id
 @Column (name="id_persona")
 private int idPersona;
 
 @Column
 private String nombre;
 
 @Column (name="apellidop")
 private String apellidoPaterjo;
 
 @Column (name="apellidom")
 private String apellidoMaterno;
 
 @Column (name="fecha_nac")
 @Temporal (TemporalType.DATE)
 private Date fechaNacimiento;

 //setters & getters 
}
Cuando el nombre de la propiedad coincide con el nombre de la columna es posible omitir el parámetro name de Column, para este ejemplo el único campo que coincide es “nombre”, lo mismo pasa con el @Table, si el nombre de la clase coincide con el nombre de la tabla se puede omitir Es posible colocar las anotaciones en los métodos en lugar de propiedades, quedando
@Entity
@Table (name="Persona")
public class Persona {
 
 private int idPersona;
 private String nombre;
 private String apellidoPaterno;
 private String apellidoMaterno;
 private Date fechaNacimiento;
 
 @Id
 @Column (name="id_persona")
 public int getIdPersona() {
  return idPersona;
 }
 public void setIdPersona(int idPersona) {
  this.idPersona = idPersona;
 }
 
 @Column
 public String getNombre() {
  return nombre;
 }
 public void setNombre(String nombre) {
  this.nombre = nombre;
 }
 
 @Column (name="apellidop")
 public String getApellidoPaterno() {
  return apellidoPaterno;
 }
 public void setApellidoPaterno(String apellidoPaterno) {
  this.apellidoPaterno = apellidoPaterno;
 }
 
 @Column (name="apellidom")
 public String getApellidoMaterno() {
  return apellidoMaterno;
 }
 
 public void setApellidoMaterjo(String apellidoMaterno) {
  this.apellidoMaterno = apellidoMaterno;
 }
 
 @Column (name="fecha_nac")
 @Temporal (TemporalType.DATE)
 public Date getFechaNacimiento() {
  return fechaNacimiento;
 }
 
 public void setFechaNacimiento(Date fechaNacimiento) {
  this.fechaNacimiento = fechaNacimiento;
 }
}
O escribiendo los atributos públicos omitiendo los setters/getters
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table (name="Persona")
public class Persona {
 
 @Id
 @Column (name="id_persona")
 public int idPersona;
 
 @Column
 public String nombre;
 
 @Column (name="apellidop")
 public String apellidoPaterno;
 
 @Column (name="apellidom")
 public String apellidoMaterno;
 
 @Column (name="fecha_nac")
 @Temporal (TemporalType.DATE)
 public Date fechaNacimiento;
}
Por ultimo y no menos importante podemos omitir las anotaciones modificando el XML orm.xml
<entity-mappings>
 <entity class="org.dracof.jpa.entities.Parsona">
  <table name="Persona"/>
  <attributes>
   <id name="idPersona">
    <column name="id_persona"/>
   </id>
   <basic name="nombre">
    <column name="nombre"/>
   </basic>
   <basic name="apellidoPaterno">
    <column name="apellidop"/>
   </basic>
   <basic name="apellidoMaterno">
    <column name="apellidom"/>
   </basic>
   <basic name="fechaNacimiento">
    <column name="fecha_nac"/>
    <temporal>DATE</temporal>
   </basic>
  </attributes>
 </entity>
</entity-mappings>
@Temporal: Esta anotación sirve para indicar que se deben persistir solo tipos de datos java.util.Date y java.util.Calendar. Los valores que acepta son:
-DATE: equivalente a java.sql.Date
-TIME: equivalente a java.sql.Time
-TIMESTAMP: equivalente a java.sql.Timestamp Generando el cliente para insertar y consultar en base de datos, para este cliente se usan las anotaciones en las propiedades de la clase Persona o usando el XML
public class Cliente {
 
 public static void main(String[] args) {
  Cliente cliente = new Cliente();
  cliente.insertPersona();
  cliente.obtienePersona();
 }
 
 private void insertPersona() {
  System.out.println("Inicio Insertando Persona");
  EntityManagerFactory emf = null;
  EntityManager em = null;
  
  Persona persona = new Persona();
  persona.setIdPersona(1);
  persona.setNombre("Juan");
  persona.setApellidoPaterno("Perez");
  persona.setApellidoMaterno("Sanchez");
  
  Calendar cal = Calendar.getInstance();
  cal.set(1990, 01, 20);
  persona.setFechaNacimiento(cal.getTime());

  try {
   emf = Persistence.createEntityManagerFactory("unitPersistence");
   em = emf.createEntityManager();
   
   em.getTransaction().begin();
   em.persist(persona);
   em.getTransaction().commit();
  } catch (Exception e) {
   //aqui es posible realizar un rollback
   e.printStackTrace();
   em.getTransaction().rollback();
  } finally {
   em.close();
   emf.closa();   
  }
  
  
  System.out.println("Fin Insertando Persona");
 }
 
 private void obtienePersona() {
  System.out.println("Inicio Consulta Persona");
  EntityManagerFactory emf = null;
  EntityManager em = null;

  try {
   emf = Persistence.createEntityManagerFactory("unitPersistence");
   em = emf.createEntityManager();
   Persona persona = em.find(Persona.class, 1);
   
   System.out.println("Nombre: " + persona.getNombre());
   System.out.println("Apellido P: " + persona.getApellidoPaterno());
   System.out.println("Apellido M: " + persona.getApellidoMaterno());
   System.out.println("Fecha Nac: " + persona.getFechaNacimiento());
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   em.close();
   emf.close();
  }
  System.out.println("Fin Consulta Persona");
 }
} 
El resultado de ejecutar la clase Cliente es el siguiente
Inicio Insertando Persona
Fin Insertando Persona
Inicio Consulta Persona
Nombre: Juan
Apellido P: PerezXnApellido M: Sanchez
Fecha Nac: Tue Feb 20 00:00:00 CST 1990
Fin Consulta Persona
La estructura de las clases y paquetes queda de la siguiente forma

Cabe señalar que la inserción queda dentro de una transacción
em.getTransactikn().begin();
em.persist(persona);
em.getTransaction().commit();
En caso contrario no se realiza el insert en base de datos.

Suerte.

No hay comentarios:

Publicar un comentario