JPA Database Schema y automatización

El uso de un JPA Database schema es bastante habitual . Cuando trabajamos con JPA nos podemos encontrar con dos opciones principales. La primera que el schema de base de datos ya exista y que nosotros únicamente tengamos que adaptarnos a él. En segundo lugar una situación en la que no existe schema de base de datos y utilizaremos nuestros objetos de negocio para generar dicho schema.

JPA Database schema

 

JPA DataBase Schema y objetos

Vamos a abordar un ejemplo que se encargue de construir un JPA Database Schema a partir de los objetos de negocio que diseñamos con nuestras clases Java . Para ello el primer paso será configurar las dependencias de maven que el proyecto necesita:

 <dependency>
 <groupId>org.hibernate.javax.persistence</groupId>
 <artifactId>hibernate-jpa-2.1-api</artifactId>
 <version>1.0.0.Final</version>
 </dependency>
 <dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-core</artifactId>
 <version>5.2.10.Final</version>
</dependency>
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.6</version>
 </dependency>
 </dependencies>

El siguiente paso es diseñar los objetos de negocio que vamos a utilizar en nuestro modelo:

package com.arquitecturajava;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Persona {
 @Id
 private String nombre;
 private String apellidos;
 private int edad;
 
 @OneToMany(mappedBy="persona")
 private List<Telefono> telefonos= new ArrayList<Telefono>();
 
 public void addTelefono(Telefono telefono) {
 telefonos.add(telefono);
 }
 
 public List<Telefono> getTelefonos() {
 return telefonos;
 }
 public void setTelefonos(List<Telefono> telefonos) {
 this.telefonos = telefonos;
 }
 public Persona() {
 super();
 }
 public Persona(String nombre, String apellidos, int edad) {
 super();
 this.nombre = nombre;
 this.apellidos = apellidos;
 this.edad = edad;
 }
 public String getNombre() {
 return nombre;
 }
 public void setNombre(String nombre) {
 this.nombre = nombre;
 }
 public String getApellidos() {
 return apellidos;
 }
 public void setApellidos(String apellidos) {
 this.apellidos = apellidos;
 }
 public int getEdad() {
 return edad;
 }
 public void setEdad(int edad) {
 this.edad = edad;
 }
}

package com.arquitecturajava;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Telefono {
 @Id
 private String marca;
 private int nserie;
 @ManyToOne
 private Persona persona;
 
 public String getMarca() {
 return marca;
 }
 public void setMarca(String marca) {
 this.marca = marca;
 }
 public int getNserie() {
 return nserie;
 }
 public void setNserie(int nserie) {
 this.nserie = nserie;
 }
 
 
}

Una vez que tenemos el modelo de objeto nos queda configurar el persistence.xml para que soporte la generación de schemas.


<persistence xmlns="http://java.sun.com/xml/ns/persistence"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
 version="2.0">

 <persistence-unit name="arquitecturajava2">

 <properties>
 <property name="hibernate.show_sql" value="true" />
 <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
 <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
 <property name="javax.persistence.jdbc.user" value="root" />
 <property name="javax.persistence.jdbc.password" value="mysql" />
 <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/java2" />

 <property name="javax.persistence.schema-generation.database.action"
 value="drop-and-create" />
 

 </properties>
 </persistence-unit>

</persistence>

En este caso lo hemos configurado para que borre (drop) y vuelve a crear todas las tablas. Para ello hemos tenido que añadir la propiedad javax.persistence.schema-generation.database.action. Una vez hecho esto es suficiente con crear un programa main muy sencillo que invoque el método generate schema:

package com.arquitecturajava;


import javax.persistence.Persistence;

public class Principal {
	public static void main(String[] args) {
		Persistence.generateSchema("arquitecturajava2",null);
	}
}

Una vez ejecutado el programa veremos como se lanzan las diferentes consultas SQL

JPA Database Schema

Como resultado se generarán las diferentes tablas en la base de datos:

jpa database schema resultado

Otros artículos relacionados:

  1. JPA Proxy y su funcionamiento
  2. Un ejemplo de JPA embedded objects
  3. Utilizando JPA NamedQueries
  4. Oracle Persistence
It's only fair to share...Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

About Cecilio Álvarez Caules

Cecilio Álvarez Caules Sun Certified Enterprise Architech (J2EE/JEE).

6 Responses to JPA Database Schema y automatización

  1. Javier Perez Antón (JPA) 1 Junio, 2017 at 11:28 #

    Muy bueno el articulo. Podrías hacer otro del proceso inverso. Gracias

    • Cecilio Álvarez Caules 1 Junio, 2017 at 14:29 #

      gracias , me apunto la idea 😉

  2. Javier Grande 2 Junio, 2017 at 8:01 #

    Hola, buenos días. Antes que nada te felicito por tu página, la verdad muy buena :D. Estuve viendo el código, y me llama la atención en la relación de Teléfono a Persona, no debería ser @ManyToOne private Persona persona en vez de @ManyToOne private Telefono telefono?

    Gracias. Saludos!

    • Cecilio Álvarez Caules 2 Junio, 2017 at 8:10 #

      Corregido , muchas gracias 🙂

  3. jose 8 Junio, 2017 at 21:11 #

    ¿Corregido? ¿entonces en la clase persona no debería ser?

    @OneToMany(mappedBy=”persona”)
    private List telefonos= new ArrayList();

    • Cecilio Álvarez Caules 8 Junio, 2017 at 21:35 #

      gracias , perdona pero a veces uno se lía con los comentarios ,creo que ahora está 🙂 . Son bastantes comentarios a responder cada día y a veces es de artículos de hace 3 años.

      gracias por insistir 😉

Deja un comentario