Para mi PFC tengo que desarrollar unos cuantos portlet, por lo que me estoy introduciendo en el mundo de Liferay utilizando sobre todo los libros “Liferay In Action”, “Portlets in Action” y “Aprende OpenXava con ejemplo”.
Anteriormente ya hemos hablado aquí de cómo implementar un portlet “hola mundo” e incluso un portlet para procesar un formulario. Ahora podríamos segur con un portlet que manejara la base de datos, pero antes de ponerme con al lío a tirar SQL´s quiero aprender Hibernate.
Vamos a dividir este post en 3 partes, la primera hablaremos de la arquitectura, de cómo empezar el proyecto utilizando Maven, Hibernate, MySQL, Eclipse y todas esas cosas, en el segundo post comentaremos como configurar todos los archivos y en el tercer post contaremos como es la implementación de la aplicación.
Esta serie de post están basados en los tutoriales:
Según la Wikipedia Hibernate es una herramienta de Mapeo objeto-relacional (ORM) para la plataforma Java que facilita el mapeo de atributos entre una base de datos relacional tradicional y el modelo de objetos de una aplicación, mediante archivos declarativos (XML) o anotaciones en los beans de las entidades que permiten establecer estas relaciones.
Es decir, vamos a utilizar una clase java con la que “interactuaremos” con la base de datos. Para ello vamos a realizar una pequeña aplicación web de ejemplo. Crearemos una pequeña agenda de contactos para pelearnos con Maven, Hibernate y Spring MVC(al final ganaremos la guerra).
La aplicación quedará así:
Arquitectura de la aplicación
Para nuestra aplicación web vamos a tener una arquitectura por capas. Accederemos a la base de datos a través de una capa (DAO), esta es la capa que utiliza Hibernate. Llamaremos a la capa DAO mediante una capa de servicios. Por ello vamos a tener una interfaz llamada ContactService.
Empezando con la BD
Para este ejemplo vamos a utilizar MySQL como Base de datos.
Lo primero de todo será crear una base de datos llamada “CONTACTMANAGER” y en una primera aproximación vamos a crear una tabla llamada “CONTACTS” donde guardamos los contactos de nuestra agenda. Los datos que vamos a guardar como mínimo son: un id (clave primaria), firstname, lastname, telephone, mail y created:
CREATE TABLE CONTACTS ( id INT PRIMARY KEY AUTO_INCREMENT, firstname VARCHAR(30), lastname VARCHAR(30), telephone VARCHAR(15), email VARCHAR(30), created TIMESTAMP DEFAULT NOW() );
Creando el proyecto con Maven
Este ha sido uno de los puntos más complicados, crear el proyecto con Maven administrar las dependencias y que todo funcione correctamente.
Para que os hagáis una idea, esta es una muestra de la cantidad de veces que he tenido que buscar en Google cuando algo no funcionaba (menos mal que siempre está Stackoverflow)
Todo eso son errores que daba la aplicación y que he ido solucionando poco a poco, así que si falla no desesperéis.
El proyecto en Eclipse lo hemos llamado demoweb-hibernate.
Estructura del proyecto
Como ya hemos comentado la aplicación utiliza Maven para construir y gestionar dependencias. Así que lo primero que tenemos que hacer es (utilizando M2Eclipse) es crear un nuevo proyecto de tipo “webapp”
Ahora antes de configurar el archivo pom.xml vamos a crear/explicar los paquetes necesarios en nuestra aplicación.
Crear siguiendo los paquetes en src / main / java carpeta.
com.jesuslc.contact.controller – Este paquete contiene las clases del controlador Spring para nuestra aplicación de gestión de contactos.
com.jesuslc.contact.form – Este paquete contendrá la clase sobre la que se “sustenta” Hibernate. Aquí tendremos una clase POJO simple, con los diferentes atributos, que serán los mismos que los de la tabla
com.jesuslc.contact.service – Este paquete contiene código para la capa de servicios para nuestra aplicación de gestión de contactos. La capa de servicios tendrá una interfaz ContactService y su correspondiente clase de implementación.
com.jesuslc.contact.dao – Esta es la capa DAO de aplicación. Consiste en una interfaz ContactDAO y una implementación correspondiente. La capa DAO usará la API de Hibernate para interactuar con la base de datos.
En el siguiente post vamos a configurar el archivo hibernate.cfg.xml y el archivo message_es.properties aunque de este ya sabemos cosillas 😉
Ahora vamos a configurar el pom.xml
Tenemos que abrir el archivo, ir a la pestaña “Dependencies “ e ir añadiendo todas las librerías que va a necesitar el proyecto.
Hay un grupo de dependencias de Spring, e el que hemos hecho un pequeño hack. Para que no halla líos con las diferentes versiones de Spring lo que hemos hecho ha sido definir una propiedad que será la versión de Spring que vamos a utilizar en nuestra aplicación. Todas las versiones de las dependencias (librerías) tienen como referencia esta propiedad, así todas las librerías van a tener la misma versión 😉
Estas son las dependencias:
Aquí dejo el archivo pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.jesuslc</groupId> <artifactId>demoweb-hibernate</artifactId> <packaging>war</packaging> <version>1</version> <name>demoweb-hibernate Maven Webapp</name> <url>http://maven.apache.org</url> <description></description> <build> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.0</version> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.4.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.10</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>20030825.184428</version> </dependency> <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>20030825.183949</version> </dependency> <dependency> <groupId>hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>3.4.0.GA</version> <type>pom</type> </dependency> </dependencies> <properties> <org.springframework.version>3.2.1.RELEASE</org.springframework.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project>
De momento es todo, aún no funciona la aplicación, tenemos que configurar una serie de archivos para empezar a picar código y que nuestra aplicación funcione. Pero es un comienzo.
Actualización
Aquí la parte 2: https://jesuslc.com/2013/03/25/poco-a-poco-con-maven-spring-hibernate-parte-2/
Aquí la parte 3: https://jesuslc.com/2013/04/02/poco-a-poco-con-maven-spring-hibernate-parte-3/
Aquí tenemos un enlace al código https://github.com/jeslopcru/DemowebMSH
La base es buena, ahora a picar. Para que maven no te de tanta guerra te recomiendo que le eches un vistazo a nexus como interfaz web para gestionar las dependencias, más fácil imposible 🙂
http://www.sonatype.org/nexus/
Me gustaMe gusta
muchas gracias lo probaré. Prometo post.
Lo que pasa es que antes quería pegarme un poco a machete 😉
PD: He leido tu blog y el proyecto con iOS y los códigos de barras es bastante interesante.
Me gustaMe gusta
Estaré atento a ese post porque seguro que aprendo algo nuevo. Maven es un gran paso adelante con respecto a ant porque te permite gestionar las dependencias de una forma unificada, se acabó eso de que cada uno tiene la version que le parece de tal jar. Ya no tienes que ir uno a uno por los jar, aunque eso ultimo no sea del todo cierto mientras los desarrolladores de las distintas librerias no sincronizan sus repositorios con los repositorios centrales de maven. Mientras ese problema se va resolviendo, herramientas como nexus te permite gestionar los jar de una forma visual.
Por lo demás, gracias! es un proyecto pensado como una prueba de concepto, en plan, por qué nadie lo ha hecho antes? y luego descubrí que habia algo por ahí que se llama NFC. En ppio la idea era y sigue siendo tener una manera para poder comprar un producto fisico en una tienda física sin tener que pasar por una cola, un tema que no es el fuerte precisamente de NFC, aunque reconozco que tiene sus puntos fuertes, por ejemplo, poder usarlo incluso cuando el movil esta apagado.
Estaré atento a tu blog
Me gustaMe gusta
Está increíble el tutorial… aquí te dejo un ejemplo del mismo estilo pero más cortito: Configuración proyecto web MVC con Eclipse y Spring 3.2
Me gustaMe gusta
Me costó mucho pero finalmente después de varios intentos fallidos funcionó. Gracias
Me gustaMe gusta
Hola, estoy intentando hacer el deploy y estoy teniendo el siguiente error:
Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project demoweb-hibernate: Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter ->
Me estara faltando alguna configuracion de repositorio?
Me gustaMe gusta
Muy buen tutorial para los que estamos acabando de aprender java puro y comenzamos con los frameworks… Gracias!
Me gustaMe gusta