jueves, 16 de junio de 2011

Uso de Mapeo de Superclases

Para este ejemplo estoy usando Netbeans 6.9, Ubuntu 10.04, Glassfish V3 y Derby DB

Imaginemos que tenemos un diagrama de objetos que deberán persistir en la base de datos, por ejemplo:


En esta guía vamos a explicar como persistir esta información en la base de datos.


Primeramente creamos un nuevo enterprise project al cual llamaremos SuperclaseDB.



Luego de esto vamos a crear Session Bean, del tipo Stateless, con interface remota, en el paquete com.ejemplo.session y llamado Utilitario



Ahora vamos a crear una unidad de persistencia en el proyecto EJB llamada puSuperclase, con proveedor de persistencia TopLink.
Creamos un nuevo Datasource, al cual llamaremos jdbc/sample y como estrategia de generación de tablas seleccionamos Drop and Create y damos click en Finish.

Una vez hecho esto, vamos a crear el paquete com.ejemplo.entity.persona

Ahi, vamos a crear la clase Direccion, que tendrá la siguiente forma:
package com.ejemplo.entity.persona;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Version;

@Entity
public class Direccion implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Version
protected Long version;
private String ciudad;
private String calle;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getCalle() {
return calle;
}

public void setCalle(String calle) {
this.calle = calle;
}

public String getCiudad() {
return ciudad;
}

public void setCiudad(String ciudad) {
this.ciudad = ciudad;
}
}

Luego creamos la clase Abstracta Persona, con la siguiente notación:
package com.ejemplo.entity.persona;

import java.io.Serializable;
import javax.persistence.CascadeType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.MappedSuperclass;
import javax.persistence.OneToOne;
import javax.persistence.Version;


@MappedSuperclass
public abstract class Persona implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "DIRECCION_CASA", referencedColumnName = "ID")
private Direccion direccion;
@Version
private Long version;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public Persona() {
}

public Direccion getDireccion() {
return direccion;
}

public void setDireccion(Direccion direccion) {
this.direccion = direccion;
}
}

Voy a explicar brevemente las anotaciones de esta clase:
@MappedSuperclass: Para indicar que es una super clase mapeada
@Id: Para indicar un PK
@GeneratedValue: Usado para indicar que usaremos una tabla de secuencia
@OneToOne:Tendra una relación de uno-uno con Direccion
@JoinColumn la columna de la tabla local será "DIRECCION_CASA y se relacionará a ID en la tabla direccion
@Version: para llever la versión del registro


Luego creamos una clase llamada Gerente, con el siguiente código:
package com.ejemplo.entity.persona;

import java.io.Serializable;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "TYPE")
public class Gerente extends Persona implements Serializable {

private String email;
private String departamento;

public Gerente() {
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getDepartamento() {
return departamento;
}

public void setDepartamento(String departamento) {
this.departamento = departamento;
}
}

Finalmente creamos una clase socio, con la siguiente notación:
package com.ejemplo.entity.persona;


import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Socio extends Persona implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String celular;
private String codigoSocio;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getCelular() {
return celular;
}

public void setCelular(String celular) {
this.celular = celular;
}

public String getCodigoSocio() {
return codigoSocio;
}

public void setCodigoSocio(String codigoSocio) {
this.codigoSocio = codigoSocio;
}
}

Nota: En esta clase puse nuevamente un id, debido a que con el ejemplo quiero mostrar que el pk, puede ser sobreescrito por una de las clases hijas


Luego modificamos Utilitario, agregando el siguiente código:
package com.ejemplo.session;

import com.ejemplo.entity.persona.Direccion;
import com.ejemplo.entity.persona.Gerente;
import com.ejemplo.entity.persona.Socio;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class Utilitario implements UtilitarioRemote {
@PersistenceContext EntityManager em;

public void crearPersona() {
Gerente ger=new Gerente();
ger.setEmail("gerente@hotmail.com");
ger.setDepartamento("RRHH");
Direccion direccion=new Direccion();
direccion.setCalle("Amazonas");
direccion.setCiudad("Quito");
direccion.setId(1L);
ger.setDireccion(direccion);
Socio socio=new Socio();
socio.setId(123L);
socio.setDireccion(direccion);
socio.setCelular("098767899");
socio.setCodigoSocio("ASA56FF");
em.persist(ger);
em.persist(socio);
}
}

Su interface tendrá el siguiente código:
package com.ejemplo.session;

import javax.ejb.Remote;


@Remote
public interface UtilitarioRemote {
public void crearPersona();
}


Finalmente modificamos Main.java, al siguiente código:
package superclasedb;

import com.ejemplo.session.UtilitarioRemote;
import javax.ejb.EJB;


public class Main {
@EJB private static UtilitarioRemote utilitario;
public static void main(String[] args) {
utilitario.crearPersona();
}
}



y ejecutamos el ejemplo, teniendo la siguiente información en la base de datos:




No hay comentarios:

Publicar un comentario