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