Persistence en Java

Un POJO (Plain Old Java Object) lleva como definición una forma de enfatizar el uso de clases simples que no dependen de ningún framework en especial.
Se conoce como Persistencia a la acción de guardar en un archivo la información de un objeto para luego volver a recuperarla, sin hacer uso de la Ram.
Existen Frameworks que permiten utilizar de forma mas fácil la Persistencia como por ejemplo pueden ser Hibernate, Toplink, etc.
Para poder llevar a cabo la acción de Persistencia podemos utilizar la interfaz Serializable, que serializará un objeto para luego reconstruirlo de nuevo. 
Los campos del objeto marcados con transient no serán serializados.

Ejemplo:

public class serialization {
    public static void main(String args[]){
        try {//serializacion
            //crea el objecto e imprime sus valores por consola
            //clase pojo abajo
            MyPojo object1 = new MyPojo("Hello Persisted Object!", -33, 2.72);
            System.out.println("object1: " + object1);
            //crea un fichero para persistir el objeto
            FileOutputStream fos = new FileOutputStream("persisted-object.file");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            //escribe el objeto serializado a un archivo
            oos.writeObject(object1);
            oos.flush();
            oos.close();
        }catch (Exception e) {
            System.out.println("Exception during serialization: " + e);
            System.exit(0);
        }
        // Deserialización de objeto
        try {
            MyPojo object2;
            //abre el archivo
            FileInputStream fis = new FileInputStream("persisted-object.file");
            ObjectInputStream ois = new ObjectInputStream(fis);
            //lee el objeto del archivo
            object2 = (MyPojo) ois.readObject();
            ois.close();
            //imprime los valores del objeto persistido
            System.out.println("object2: " + object2);
            System.out.println("object2 mystring: " +object2.getMyString());
            //saca por pantalla null porque myTransString está marcado como transient
            System.out.println("object2 mystring2: " +object2.getMyTransString());           
        } catch (Exception e) {
            System.out.println("Exception during deserialization: " + e);
            System.exit(0);
        }
    }   
}
//Pojo serializado
class MyPojo implements Serializable {   
    public MyPojo(String mystring, int intVal1, double doubleVal) {
        this.myString = mystring;
        this.intVal1 = intVal1;
        this.doubleVal = doubleVal;
        this.myTransString = "Este valor no se persistirá.";
    }
    //safety ID
    private static final long serialVersionUID = 1234233342333L;
    //campos para persistir
    private String myString;
    private int intVal1;
    private double doubleVal;   
    //campos que no serán persistidos
    private transient String myTransString;
    //getters y setters
    public String getMyString() {
        return myString;
    }
    public void setMyString(String myString) {
        this.myString = myString;
    }
    public String getMyTransString() {
        return myTransString;
    }
    public void setMyTransString(String myTransString) {
        this.myTransString = myTransString;
    }
    public int getIntVal1() {
        return intVal1;
    }
    public void setIntVal1(int intVal1) {
        this.intVal1 = intVal1;
    }
    public double getDoubleVal() {
        return doubleVal;
    }
    public void setDoubleVal(double doubleVal) {
        this.doubleVal = doubleVal;
    }
    //para sacar todos los valores persistibles por pantalla
    @Override
    public String toString() {
        return "mystring=" + myString + "; intVal1=" + intVal1 + "; doubleVal=" + doubleVal;
    }
}


Persistencia API de Java


Beans de Entidad

Los EJB de entidad están directamente relacionados con los datos de la aplicación, son objetos que mantienen en memoria los datos que maneja la aplicación, las entidades que disponen de persistencia, Noticias, Usuarios, Clientes, etc...

Anotaciones de entidades POJO's:

Anotación @Entity Indica que el objeto es una entidad.
Anotación Table indica la tabla de base de datos que contiene objetos de este tipo. 
Toda entidad debe tener una clave primaria que se debe identificar con la anotación @Id. Además, todas las entidades deben contener un constructor vacío.

Anotaciones @Id, @IdClass, @EmbeddedId
Se emplean para declarar claves primarias de clases, bien de forma simple @Id o compuesta @IdClass y @EmbeddedId.
 
Veamos un código utilizando @IdClass:
 
@Entity 
@IdClass(PersonaId.class) 
public class Persona { 
    @Id 
    private int id; 
    @Id 
    private String nombre;  
    ... 
    public Persona() { } 
    //METODOS Getters y Setters  
} 
 
public class PersonaId { 
     int id; 
    String nombre; 
     public boolean equals(Object o) { 
        // Codigo que comprueba si las dos entidades son iguales 
    } 
}
Y ahora un código utilizando @EmbeddedId
 
@Entity 
public class Persona { 
  @EmbeddedId 
  @AttributeOverrides({ 
     @AttributeOverride(name = "id", column = @Column(name = "ID",  
                              nullable = false, precision = 5, scale = 0)), 
    @AttributeOverride(name = "nombre", column = @Column(name = "NOMBRE"
                       nullable = false, length = 50)), 
 }) 
    private PersonaId id; 
    public Persona() { } 
    //Métodos Getters y Setters  
} 

@Embedded 
public class PersonaId { 
     int id; 
    String nombre; 
     public PersonaId() { } 
     public boolean equals(Object o) { 
        // Codigo que comprueba si las dos entidades son iguales 
    } 
}
@Entity 
@Table(name="PERSONAS") 
public class Persona { 
    @Id 
    private String nombre;  
    @Embedded 
    @AttributeOverrides({@AttributeOverride(name="codigoPostal",  
                                            column=@Column(name="CODIGOPOSTAL")), 
                         @AttributeOverride(name="direccionPostal",  
                                            column=@Column(name="DIRECCIONPOSTAL")) 
    }) 
    private Direccion direccion; 
    public Persona() { } 
    //Métodos Getters y Setters  
} 

@Embeddable  
public class Direccion implements Serializable {  
    private String direccionPostal; 
    private String ciudad; 
    private int codigoPostal; 
    private String pais; 
    public Direccion() { } 
    public boolean equals(Object o) { 
        // Codigo que comprueba si las dos entidades son iguales 
    }   
}

No hay comentarios:

Publicar un comentario