Ejemplo MAVEN y JPA Básico (SI-2018, semana 1)

Ejemplo de creación de proyectos Maves y uso desde línea de comandos
Ejemplo de mapeo JPA

PREVIO

Requisitos previos

Crear BD para los ejemplos

mysql -u root -p    [pedirá la contraseña de MySQL]

mysql> create database pruebas_si;
mysql> grant all privileges on pruebas_si.* to si@localhost identified by "si";

Adicionalmente, puede ser necesario establecer un formato de fecha compatible

mysql> set @@global.time_zone = '+00:00';
mysql> set @@session.time_zone = '+00:00';

CREAR Y CONFIGURAR PROYECTO MAVEN

Crear un proyecto Maven usando el arquetipo maven-archetype-quickstart

mvn archetype:generate -DgroupId=es.uvigo.mei \
                         -DartifactId=jpainicial \
                         -Dversion=1.0 \
                         -Dpackage=es.uvigo.mei.jpainicial\
                         -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.3

CONFIGURACIÓN PARA JPA

Declarar las dependencias necesarias en pom.xml

1 Declarar el uso de Hibernate como provider JPA (ver. 5.3.7) dentro de <dependencies>...</dependencies>

<project>
   ...
   <dependencies>
       <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-entitymanager</artifactId>
          <version>5.3.7.Final</version>
       </dependency>
       ...
   </dependencies>
   ...
</project>

El resto de dependencias necesirias para hibernate-entitymanager serán descargadas e instalaldas por Maven.

2 Declarar el connector JDBC para MySQL (ver. 8.0.13) dentro de <dependencies>...</dependencies>

<project>
   ...
   <dependencies>
      ...
      <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <version>8.0.13</version>
      </dependency>
   </dependencies>
   ...
</project>

MODELO E-R

Modelo E-R

AÑADIR ENTIDADES

Crear el directorio para el paquete entidades y copiar los ficheros Java con la definición de las entidades

mkdir -p src/main/java/es/uvigo/mei/jpainicial/entidades

(por ahora no se crearán tests unitarios con JUnit)

cd src/main/java/es/uvigo/mei/jpainicial/entidades

wget http://ccia.esei.uvigo.es/docencia/SI/1819/jpainicial_entidades.tar.gz

tar xzvf jpainicial_entidades.tar.gz
rm jpainicial_entidades.tar.gz

Aspectos a revisar

  1. Salvo en el caso de la entidad Cliente, que usa como clave primaria su DNI, las demás entidades usan claves autogeneradas de tipo GenerationType.IDENTITY (necesario para mapear un atributo autoincremental de MySQL)
  2. Salvo para la relación entre Pedido y su entidad débil LineaPedido, nos hemos limitado a relaciones unidireccionales.

  3. La relación N:M entre Articulo y Almacen tiene un atributo propio, stock, por lo que se modelado esa relación como @Entity, emplando dos relaciones unidireccionales @ManyToOne hacia Articulo y Almacen.

Configurar Persistence Unit de JPA

Definir fichero persistence.xml en src/main/resources/META-INF

<volver a raiz del proyecto>

mkdir -p src/main/resources/META-INF
cd src/main/resources/META-INF
nano persistence.xml

Contenido a incluir

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="jpainicial.PU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <class>es.uvigo.mei.jpainicial.entidades.Almacen</class>
    <class>es.uvigo.mei.jpainicial.entidades.Articulo</class>
    <class>es.uvigo.mei.jpainicial.entidades.ArticuloAlmacen</class>
    <class>es.uvigo.mei.jpainicial.entidades.Cliente</class>
    <class>es.uvigo.mei.jpainicial.entidades.Familia</class>
    <class>es.uvigo.mei.jpainicial.entidades.LineaPedido</class>
    <class>es.uvigo.mei.jpainicial.entidades.Pedido</class>

    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/pruebas_si"/>
      <property name="javax.persistence.jdbc.user" value="si"/>
      <property name="javax.persistence.jdbc.password" value="si"/>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>

      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.format_sql" value="true"/>
    </properties>
  </persistence-unit>
</persistence>

PROBAR EL PROYECTO

Añadir “main()” de ejemplo

<volver a raiz del proyecto>

cd src/main/java/es/uvigo/mei/jpainicial/
wget http://ccia.esei.uvigo.es/docencia/SI/1819/{MainEntidades,MainPedido}.java

Ejecutar los main()

<volver a raiz del proyecto>
mvn package
mvn exec:java -Dexec.mainClass="es.uvigo.mei.jpainicial.MainEntidades"
mysql -u si -p   <con contraseña si>

mysql > use pruebas_si;
mysql > show tables;
mysql > describe Articulo;
mysql > select * from Articulo;
mysql > ...
<volver a raiz del proyecto>

mvn exec:java -Dexec.mainClass="es.uvigo.mei.jpainicial.MainPedido"

TAREA EXTRA