Ya no queda nada para tener una aplicación como esta. Con ella podremos administrar nuestros contactos de forma simple y fácil. Además estamos aprendiendo muchísimo(o al menos yo) sobre Spring MVC, Hibernate y Maven.  Aunque todavía nos queda mucho por aprender.

Ya hemos visto como crear el proyecto y cómo configurarlo para que con unas pocas clases tener una aplicación CRUD que gestiona nuestra agenda.

Para terminar el proyecto solo nos queda crear las clases e interfaces, para no perdernos vuelvo a  poner la imagen del árbol de archivos para que no nos perdamos creando clases.

En primer lugar vamos a crear la clase Contact, que es una simple clase POJO que se usará para hacer a Hibernate interactuar con la BD. Esta clase será una entidad que se vinculará  con la tabla Contacts que creamos en un post anterior.

/demoweb-hibernate/src/main/java/com/jesuslc/contact/form/Contact.java

package com.jesuslc.contact.form;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="CONTACTS")
public class Contact {

 @Id
 @Column(name="ID")
 @GeneratedValue
 private Integer id;

 @Column(name="FIRSTNAME")
 private String firstname;

 @Column(name="LASTNAME")
 private String lastname;

 @Column(name="EMAIL")
 private String email;

 @Column(name="TELEPHONE")
 private String telephone;

 public String getEmail() {
 return email;
 }
 public String getTelephone() {
 return telephone;
 }
 public void setEmail(String email) {
 this.email = email;
 }
 public void setTelephone(String telephone) {
 this.telephone = telephone;
 }
 public String getFirstname() {
 return firstname;
 }
 public String getLastname() {
 return lastname;
 }
 public void setFirstname(String firstname) {
 this.firstname = firstname;
 }
 public void setLastname(String lastname) {
 this.lastname = lastname;
 }
 public Integer getId() {
 return id;
 }
 public void setId(Integer id) {
 this.id = id;
 }
}
  • @Entity le decimos a Hibernate que esta clase representa un objeto persistente.
  • @Table(name=»CONTACTS») le dice que la tabla que tiene que utilizar para mapear los objetos de esta clase es CONTACTS.
  • @Id es una notación que indica que la variable Id es la clave primaia de la tabla
  • @GeneratedValude indica que el valor se lo dará la BD y no se hará en el código, es decir será un valor autogenerado.
  • @Column (name=»nombre»)  es una notación que se utiliza para asignar la propiedad a la columna de la base de datos.

Llegados a este punto tenemos mapeada la base de datos, nuestra base de datos es pequeña (solo una tabla) pero si tuviésemos más solo tendríamos que realizar unas cuantas clases más.

Así que ahora conviene que recordemos la arquitectura de nuestra aplicación para que a la hora de ir creando nuevas clases no perdamos el norte.

Capa de acceso a datos (DAO)

La capa DAO es la que se encarga de manejar los datos directamente, esta capa consta de una interfaz y de la clase que implementa dicha interfaz.

La interfaz ContactDAO indica las acciones que podemos realizar con los datos, en nuestro caso Contactos. Por tanto nosotros podemos Añadir contactos (AddContact), Borrar contactos (DeleteContact) y listar los contactos que tenemos guardados en la BD (listContact)

Aquí tenemos la Interfaz:

/demoweb-hibernate/src/main/java/com/jesuslc/contact/dao/ContactDAO.java

package com.jesuslc.contact.dao;
import com.jesuslc.contact.form.Contact;
import java.util.List;
public interface ContactDAO {
public void addContact(Contact contact);
 public List<Contact> listContact();
 public void removeContact(Integer id);
}

La clase ContactAOImpl implementa la interfaz ContactDAO. Debemos tener en cuenta que vamos a utilizar las notaciones de Spring @Repository @Autowired por eso tenemos que estar atentos en las importaciones.

/demoweb-hibernate/src/main/java/com/jesuslc/contact/dao/ContactDAOImpl.java

package com.jesuslc.contact.dao;
import java.util.List;
import com.jesuslc.contact.form.Contact;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class ContactDAOImpl implements ContactDAO {
@Autowired
 private SessionFactory sessionFactory;
public void addContact(Contact contact) {
 sessionFactory.getCurrentSession().save(contact);
 }
public List<Contact> listContact() {
return sessionFactory.getCurrentSession().createQuery("from Contact")
 .list();
 }
public void removeContact(Integer id) {
 Contact contact = (Contact) sessionFactory.getCurrentSession().load(
 Contact.class, id);
 if (null != contact) {
 sessionFactory.getCurrentSession().delete(contact);
 }
}
}

Al utilizar estas anotaciones le indicamos a Spring que esta clase es especial y Spring debe interactuar con ella. Al tener tan separadas cada una de las clases eliminamos el acoplamiento y por ello nos «olvidamos» de la base de datos en las capas superiores.

Capa de Servicio

En nuestro caso la capa de servicios es similar a la capa DAO. En la capa de servicio «se implementan las reglas de negocio» en nuestro caso la aplicación de gestión de contactos es básica y no tiene ninguna regla de negocio.

Aquí tenemos la interfaz:

/demoweb-hibernate/src/main/java/com/jesuslc/contact/service/ContactService.java

package com.jesuslc.contact.service;
import java.util.List;
import com.jesuslc.contact.form.Contact;
public interface ContactService {

 public void addContact(Contact contact);
 public List<Contact> listContact();
 public void removeContact(Integer id);
}

En este caso para indicar a Spring que esta es la copa de servicios hemos utilizado la notación @Service

/demoweb-hibernate/src/main/java/com/jesuslc/contact/service/ContactServiceImpl.java

package com.jesuslc.contact.service;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jesuslc.contact.dao.ContactDAO;
import com.jesuslc.contact.form.Contact;
@Service
public class ContactServiceImpl implements ContactService {

 @Autowired
 private ContactDAO contactDAO;

 @Transactional
 public void addContact(Contact contact) {
 contactDAO.addContact(contact);
 }

 @Transactional
 public List<Contact> listContact() {

 return contactDAO.listContact();
 }

 @Transactional
 public void removeContact(Integer id) {
 contactDAO.removeContact(id);
 }
}

Añadiendo el Controlador al modelo MVC

Ya tenemos casi terminada nuesrta aplicación. Solo tenemos que añadir la clase Controlador a nuestro proyecto.

/demoweb-hibernate/src/main/java/com/jesuslc/contact/controller/ContactController.java

package com.jesuslc.contact.controller;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.jesuslc.contact.form.Contact;
import com.jesuslc.contact.service.ContactService;
@Controller
public class ContactController {
@Autowired
 private ContactService contactService;
@RequestMapping("/index")
 public String listContacts(Map<String, Object> map) {
map.put("contact", new Contact());
 map.put("contactList", contactService.listContact());
return "contact";
 }
@RequestMapping(value = "/add", method = RequestMethod.POST)
 public String addContact(@ModelAttribute("contact")
 Contact contact, BindingResult result) {
contactService.addContact(contact);
return "redirect:/index";
 }
@RequestMapping("/delete/{contactId}")
 public String deleteContact(@PathVariable("contactId")
 Integer contactId) {
contactService.removeContact(contactId);
return "redirect:/index";
 }
}

Nuestro controlador Spring tiene tres métodos para manipular la gestión de contactos.

  • listContact: Este método utiliza la interfaz de la capa de servicios (ContactServer) para obtener todos los contactos de nuestra aplicación. Debemos tener en cuenta que hemos mapeado el «/index» es decir, que cuando accedamos a demoweb-hibernate/index será cuando llamemos a este método.
  • addContact Este método añade un nuevo contacto a la lista. Con la notación @ModelAttribute obtenemos los datos del contacto.  Debemos tener en cuenta que hemos mapeado el «/add». El método utiliza una solicitud POST para añadir un contacto sirviendose de la capa de servicio.
  • DeleteContact  Este método elimina un contacto. Al igual que add este método redirecciona a /index. Este método necesita el id para poder eliminar el contacto.

Creando la Vista

Por último solo tenemos que crear una página .jsp

/demoweb-hibernate/src/main/webapp/WEB-INF/jsp/contact.jsp

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
 <title>Spring 3 MVC Series - Contact Manager</title>
 <style type="text/css">
 body {
 font-family: sans-serif;
 }
 .data, .data td {
 border-collapse: collapse;
 width: 80%;
 border: 1px solid #aaa;
 margin: 2px;
 padding: 2px;
 }
 .data th {
 font-weight: bold;
 background-color: #5C82FF;
 color: white;
 }
 </style>
</head>
<body>
<h2><spring:message code="label.title"/></h2>
<form:form method="post" action="add.html" commandName="contact">
<table>
 <tr>
 <td><form:label path="firstname"><spring:message code="label.firstname"/></form:label></td>
 <td><form:input path="firstname" /></td> 
 </tr>
 <tr>
 <td><form:label path="lastname"><spring:message code="label.lastname"/></form:label></td>
 <td><form:input path="lastname" /></td>
 </tr>
 <tr>
 <td><form:label path="email"><spring:message code="label.email"/></form:label></td>
 <td><form:input path="email" /></td>
 </tr>
 <tr>
 <td><form:label path="telephone"><spring:message code="label.telephone"/></form:label></td>
 <td><form:input path="telephone" /></td>
 </tr>
 <tr>
 <td colspan="2">
 <input type="submit" value="<spring:message code="label.addcontact"/>"/>
 </td>
 </tr>
</table> 
</form:form>

<h3>Contactos</h3>
<c:if test="${!empty contactList}">
<table class="data">
<tr>
 <th><spring:message code="label.firstname"/></th>
 <th><spring:message code="label.email"/></th>
 <th><spring:message code="label.telephone"/></th>
 <th>&nbsp;</th>
</tr>
<c:forEach items="${contactList}" var="contact">
 <tr>
 <td>${contact.lastname}, ${contact.firstname} </td>
 <td>${contact.email}</td>
 <td>${contact.telephone}</td>
 <td><a href="delete/${contact.id}">Eliminar</a></td>
 </tr>
</c:forEach>
</table>
</c:if>

</body>
</html>

sss

A la página le hemos dado un poco de color utilizando css y por fin este es el resultado final.

Para que esto se muestre solo tenemos que pinchar sobre el boton play y poner como Goal deploy

 

Aquí tenemos un enlace al código https://github.com/jeslopcru/DemowebMSH

Actualización

Aquí la parte 1: https://jesuslc.com/2013/03/19/poco-a-poco-con-maven-spring-hibernate/

Aquí la parte 2: https://jesuslc.com/2013/03/25/poco-a-poco-con-maven-spring-hibernate-parte-2/

36 respuestas a “Poco a poco con Maven, Spring, Hibernate (parte 3)”

  1. Avatar de Miguel
    Miguel

    ¿Cómo conseguiste ejecutar la aplicación con Apache Tomcat?, yo lo he intentado y no lo consigo, me sale el típico error de Error 404.

    Me gusta

    1. Avatar de jesuslc

      La aplicación de este post es un ejemplo para ilustrar como hacer funcionar maven spring e hibernate. Depende de la de la aplicación se utiliza una arquitectura u otra

      Me gusta

      1. Avatar de Jesus Daniel
        Jesus Daniel

        Hola Jesus, excelente post. Hice cada paso tal cual como esta en la guia utilizando tomcat 7 y eclipse sts spring, tambien hice lo de desploy y el .war, pero cada que corro el proyecto me sigue saliendo el error 404 (El recurso requerido no está disponible.). Alguna sugerencia?

        Me gusta

    2. Avatar de Drazzen
      Drazzen

      Es necesario que indiques /index al final de la ruta, si no no está accediendo a ningún recurso (al ejecutarse en el IDE no se te abre con /index, al menos en Netbeans). Si posteriormente te sale alguna excepción, ya se van solucionando igual que en el IDE

      Me gusta

  2. Avatar de Miguel
    Miguel

    No entiendo muy bien lo de Para que esto se muestre solo tenemos que pinchar sobre el boton play y poner como Goal deploy.

    De ahí lo que no sé hacer es lo de poner como Goal deploy. ¿Podrías explicármelo?, gracias.

    Me gusta

    1. Avatar de jesuslc

      Hola Miguel!
      Para que todo esto funcione es necesario que tengas instalado el plugin de ecplise m2eclipse en tu eclipse (Aquí un post de como hacerlo: https://jesuslc.com/2012/12/07/usar-maven-desde-eclipse-m2eclipse/) si no es así también puedes hacerlo con la consola de Maven (si tienes práctica)

      Ahora bien, una vez que ya esta el plugin instalado en Eclipse seleccionamos el archivo pom.xml (que se ponga en azul) y nos vamos al menu Run–>Ruan As(también vale el boton play verde) y seleccionamos la opción «maven build…». Esto nso abrirá un cuadro de dialogo, donde uno de los cuadros de texto pone «goals» allí es donde tenemos que escribir «deploy» (sin comillas), esto nos generará una carpeta nueva en el proyecto llamada target (a veces hay que pulsar F5 para resfrescar el proyecto y que aparezca la carpeta) Esta carpeta tiene un archivo .war
      Una vez que tengamos esto, solo tenemos que pegar este .war dentro de la carpeta webapps que esta en la instalación de Tomcat.
      Cada vez que hagas cambios es necesario que vuelvas a copiar el nuevo war en la carpeta webapps
      Siento que la explicación no haya quedado clara, espero que este comentario te ayude 😉

      No te preocupes, esta operación de copiar el war es un «rollo» así que he escrito un post (el día 8 estará) para hacer todo esto de manera automática. Es decir, le damos al play y solo se genera el archivo war y se copia en webapps de tomat.

      Me gusta

      1. Avatar de Miguel
        Miguel

        Muchas gracias, aún así me da fallo, cuando pongo en goals lo de deploy y le doy al botón Run todo se va ejecutando bien, pero al final en la consola sale el siguiente error:

        [ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.5: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 -> [Help 1]
        [ERROR]
        [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
        [ERROR] Re-run Maven using the -X switch to enable full debug logging.
        [ERROR]
        [ERROR] For more information about the errors and possible solutions, please read the following articles:
        [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

        ¿Cómo podría subsanar ese error?. Por cierto, aún no pude ejecutar la aplicación correctamente.

        Gracias.

        Me gusta

      2. Avatar de jesuslc

        Creo que se me olvidó coméntarlo, hay veces que es necesario «limpiar» antes de hacer deploy.
        Creo que se solucionará poniendo como goals: «clean deploy»

        Un saludo

        Me gusta

  3. Avatar de Poco a poco con Maven, Spring, Hibernate | Jesús L.C.

    […] Aquí la parte 3: https://jesuslc.com/2013/04/02/poco-a-poco-con-maven-spring-hibernate-parte-3/ […]

    Me gusta

  4. Avatar de Poco a poco con Maven, Spring, Hibernate (parte 2) | Jesús L.C.

    […] Aquí la parte 3: https://jesuslc.com/2013/04/02/poco-a-poco-con-maven-spring-hibernate-parte-3/ […]

    Me gusta

  5. Avatar de Carlos
    Carlos

    Buenos días, estupendo tutorial pero tengo un problema.
    Me ocurre lo mismo que ha Migel. Aun intentando hacer el build desde la consola y sólo con maven. Tengo algo de experiencia con maven y lo he intentado desde eclipse y desde la consola. El war se genera pero el log muestra el error que indica Miguel.
    Muchas gracias

    Me gusta

    1. Avatar de jesuslc

      Buenos días Carlos,
      No te preocupes, creo que eso pasa porque estas intentando hacer un deploy y no has configurado tomcat (u otro servidor de aplicaciones) en Maven. Aquí te dejo un tutorial de como configurar maven y tomcat para que los deploys funcionen: http://www.mkyong.com/maven/how-to-deploy-maven-based-war-file-to-tomcat/ (en el blog hay una traducción de este artículo)
      Si se genera el war puedes copiarlo directamente a la carpeta deploy (con tomcat funcionando) y se desplegará <>.

      Un vez que haya desplegado para probar tienes que entrar aquí: localhost:8080/demoweb-hibernate/index

      Me gusta

      1. Avatar de Carlos
        Carlos

        Buenas de nuevo.
        Efectivamente no he configurado mi servidor para maven. Yo estoy utilizando GlassFish y quería preguntar si hay alguna manera para que maven genere sólo el WAR, y yo manualmente (mediante el comando «asadmin deploy» de glassfish) puedo desplegar la aplicacion.
        Aunque el maven falla en el deploy, si se genera el WAR que despliego en el servidor y la aplicación funciona correctamnet.
        Muchas gracias por la ayuda, era la URL que la estaba poniendo mal en las pruebas.

        Me gusta

      2. Avatar de jesuslc

        Si mal no recuerdo, creo que son loa comandos de maven. Si utilizas deploy, maven va a crear el war y desplegar la aplicación. En tu caso cómo no tienes configurado el el.servidor de aplicaciones maven te dará un error porque no puede desplegar.

        Si utilizas el comando build (creo aunque mejor compruébalo en la docu de maven) sólo generará el war y ya podrás hacer con el li que quieras.

        Espero que te sea de ayuda. Un saludo.

        Enviado desde mi HTC

        Me gusta

  6. Avatar de Marian
    Marian

    Hola.
    He seguido todos los pasos pero no encuentro la forma de que me funcione….
    Estoy usando tomcat y oracle, por lo que buscando por ahí he cambiado las configuraciones necesarias, pero me sigue dando el siguiente error:

    GRAVE: StandardWrapper.Throwable
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘contactDAOImpl’: Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public org.hibernate.SessionFactory com.jesuslc.contact.dao.ContactDAOImpl.sessionFactory; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘sessionFactory’ defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property ‘configurationClass’ of bean class [org.springframework.orm.hibernate4.LocalSessionFactoryBean]: Bean property ‘configurationClass’ is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

    ¿Alguien sabría decirme por que es??

    Gracias.

    Me gusta

  7. Avatar de Cristiane
    Cristiane

    Muy buen tutorial, basico simple pero efectivo, funciona a la primera si sigues los pasos cautelosamente. Gracias

    Me gusta

  8. Avatar de Fran
    Fran

    El tutorial es muy claro, pero debo de estar haciendo algo mal porque no me funciona ni el código del ejemplo que me he bajado.

    Resulta que consigo generar el war y llevarlo a la carpeta webapp de tomcar, pero no consigo verlo en el navegador.

    ¿Cual es la url que debe abrir la página contact.jsp?

    Si saco la página contact.jsp de la ruta /WEB-INF/jsp y lo coloco en la raiz /webapp consigo ver la pagina, pero no procesa las etiquetas de spring, y me lanza excepciones.

    ¿Alguien puede ayudarme?

    Me gusta

  9. Avatar de nigma
    nigma

    El turtorial muy bueno pero cuando lo despliego y quiero ir a la jsp me da el siguiente erro el Tomcat:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘contactController’: Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.contact.service.ContactService com.contact.controller.ContactController.contactService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘contactServiceImpl’: Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.contact.dao.ContactDAO com.contact.service.ContactServiceImpl.contactDAO; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘contactDAOImpl’: Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.hibernate.SessionFactory com.contact.dao.ContactDAOImpl.sessionFactory; nested exception is java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider;

    Lo he probado tanto haciendo paso a paso el ejemplo como descargando el zip del link del proyecto y desplegando ambos war.

    Pdrías Ayudarme??

    Me gusta

    1. Avatar de Benji
      Benji

      Genial el post Jesús, explicado sencillo y directo. Estoy haciendo el TFC con una aplicación que use Spring MVC, Hibernate y Maven y tu post me ha ayudado a meterme en estas tecnologias. Muchisimas gracias!!!

      Me gusta

  10. Avatar de TRON
    TRON

    -Jesus: Excelente material, de primera!. Es genial cuando documentan y explican bien los paso a paso(solo falto mas claridad en el paso final para levantar la app) gracias!!

    -Estimados: para levantar la app de forma facil y puedan probar, lo mejor es que tengan seteado un server Apache Tomcat 7 en su eclipse. A mi me funciono a la primera:

    1.Una vez terminado el proyecto, le hacen un CLEAN en Project>Clean
    2.Recuerden hacer doble click en el server para q los lleve a las propiedades y seleccionar en «Server Locations» la opcion «Use Tomcat Installation»
    3.Con el boton derecho sobre el proyecto, le dan RUN AS > Run on Server.
    4.Se levanta el Tomcat y desde apache o url entren a : http://localhost:8080/demoweb-hibernate/index , que asi esta mapeado el acceso del controller.
    5.Y listo !

    saludos.

    Me gusta

  11. Avatar de JARj
    JARj

    Estimado, gran tutorial.

    Tengo una consulta, He visto la misma estructura en otros proyectos java pero se incluyen dos capas adicionales (business y DTO) ¿Cual sería el beneficio para este tipo de aplicación?.

    Me gusta

    1. Avatar de jesuslc

      Esto es sólo un ejemplo de aplicación. El dividir una aplicación en capas es una «buena práctica», las ventajas en un ejemplo tan pequeño no son claras. Esta capas sirven para diferenciar/ ordenar el código y las funcionalidades de la aplicación

      Me gusta

  12. Avatar de AlbertoVill
    AlbertoVill

    Muchas gracias por tu trabajo Jesús. Está muy bien explicado. Me ha sido más útil que los ejemplos del señor Mykong.

    Me gusta

    1. Avatar de jesuslc

      Muchas gracias por tu comentario y por tu apoyo. Hace tiempo, cuando escribí esos post y no tenía ni idea que podrían ser útiles 🙂

      Me gusta

  13. Avatar de elena
    elena

    Jesus primero que nada muchas gracias por el tutorial. esta muy claro y me ayudo mucho a entender varias cositas… pero tengo un problema con
    @RequestMapping(«/index»)
    public String listContacts(Map map) {
    map.put(«contactw Contact());
    map.put(«contactListntactService.listContact());
    return «contact»;
    }

    el put me da error, dice que no estan cerradas las comillas… soy nueva «javeando»… me podrias dar una manito ? gracias

    Me gusta

    1. Avatar de Nino
      Nino

      Son típicos errores de tipeo » » de todo desarollador que deja su código en la web!!

      Me gusta

  14. Avatar de cristianchaparroa

    Hay alguna manera de generar las entidades automaticamente, sin necesidad de mapearlas a mano de tal manera que funcione con hibernate y spring?

    Me gusta

  15. Avatar de alejandroito

    Hola….a mi me ha dado algún quebradero con los bean dentro del spring-servlet.xml, pero al final me ha funcionado, después de limpiar errores y siguiendo las pautas de ejecución de TRON.
    Gracias por el post.

    Me gusta

  16. Avatar de Martin
    Martin

    Hola Jesus, deseo felecitarte por tu post, y deseo que me ayudes a resolver un problema que tengo, cuando despliego una aplicacion desde eclipse.
    He generado el war y cuando lo despliego desde el navegador
    http://localhost:7001/ProjectoPruebaMaven/index.jsp
    me muestra el error 403 forbidden, yo tengo dentro de src/main/webapp el web.xml y el index.jsp que esta pasando?

    Me gusta

    1. Avatar de jesuslc

      Hola, gracias Martin. Aquí tienes el repositorio de github con el código https://github.com/jeslopcru/DemowebMSH espero que te sirva

      Me gusta

  17. Avatar de Dianely
    Dianely

    Hola, he seguido paso a paso y al finalizar cuando ya conecto con BD me arroja este error, tendras algun idea?

    GRAVE: Cannot create PoolableConnectionFactory (The server time zone value ‘Hora de verano romance’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.)
    may 15, 2016 1:33:55 PM org.hibernate.cfg.SettingsFactory buildSettings
    ADVERTENCIA: Could not obtain connection metadata
    org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (The server time zone value ‘Hora de verano romance’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.)
    at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
    at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:85)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:84)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2073)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1298)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:793)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:715)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:189)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:743)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:629)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:677)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:548)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1238)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1151)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1038)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4997)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5289)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.sql.SQLException: The server time zone value ‘Hora de verano romance’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:695)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:663)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:653)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:638)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:606)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:624)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:620)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:68)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1683)
    at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:656)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:349)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:221)
    at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38)
    at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
    at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556)
    at org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545)
    … 40 more
    Caused by: com.mysql.cj.core.exceptions.InvalidConnectionAttributeException: The server time zone value ‘Hora de verano romance’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:54)
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:73)
    at com.mysql.cj.jdbc.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:118)
    at com.mysql.cj.mysqla.MysqlaSession.configureTimezone(MysqlaSession.java:308)
    at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:2474)
    at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:1817)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1673)
    … 47 more

    Me gusta

  18. Avatar de Jaime Ramirez
    Jaime Ramirez

    Es un tema muy interesante, gracias me sirvió de mucho, para aplicarlo a JSF.

    Me gusta

  19. Avatar de Retrospectiva 2017 – Jesús L.C.

    […] En cuanto a post, los más leídos con diferencia siguen siendo la serie Poco a poco con Maven, Spring, Hibernate Parte 2 y parte 3 […]

    Me gusta

  20. Avatar de Pablo
    Pablo

    Hola, gracias por esta guia, me sirvio mucho. Pero tengo una consulta, como podria modificar el .jsp en caso de tener que enviar una clase que a su vez tenga un atributo de tipo Clase. Por ejemplo creo un nuevo contacto y le quiero agregar una ciudad en otro form de la misma pagina(una clase ciudad con todos sus atributos), asi de esta manera ya le llegaria una clase cargada al controller.

    Me gusta

  21. Avatar de John Porras R

    Excelente trabajo, me ayudo mucho ha entender como se relaciona spring con hibernate y mysql, mi duda es como seria la conexión con oracle 11g. lo he intentado pero sin exito.

    Espero que me puedas ayudar.

    Gracias

    Me gusta

  22. Avatar de John Porras R

    Hola me ayudo mucho tu tutorial, pero tengo una consulta he intentado hacer la conexión oracle 11g, pero sin exito,.
    Gracias

    Me gusta

Replica a Martin Cancelar la respuesta

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.

Jesús López

Soy un Ingeniero en Informática y apasionado de la programación. Me gusta disfrutar de mi familia, viajar y perdernos paseando.  Me mola programar, hacer tests y refactorizar código . Practico Test Driven Development (TDD) y me lo paso bien con el legacy codeLeer más

Sígueme en: