Ejemplo de creación de proyectos Maves y uso desde línea de comandos
Ejemplo de mapeo JPA
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';
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
tree jpainicial
ó ls -lR jpainicial
pom.xml
generado <build>...</build>
para forzar a utilizar las últimas versiones de los plugins y no las declaradas en el arquetipopom.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>
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
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)Salvo para la relación entre Pedido
y su entidad débil LineaPedido
, nos hemos limitado a relaciones unidireccionales.
anadirLineaPedido()
y anadirLineaPedidoInterno()
en Pedido
, que se coordinan con el método setPedido()
de LineaPedido
para que en todo momento los dos lados de la relación sean correctos.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
.
ArticuloAlmacenId
, vinculada a la entidad que soporta la relación con atributos mediante la anotación@IdClass
.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>
<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
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"