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 y @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> </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/
¿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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Muy buen tutorial, basico simple pero efectivo, funciona a la primera si sigues los pasos cautelosamente. Gracias
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
-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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Son típicos errores de tipeo » » de todo desarollador que deja su código en la web!!
Me gustaMe gusta
Hay alguna manera de generar las entidades automaticamente, sin necesidad de mapearlas a mano de tal manera que funcione con hibernate y spring?
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Hola, gracias Martin. Aquí tienes el repositorio de github con el código https://github.com/jeslopcru/DemowebMSH espero que te sirva
Me gustaMe gusta
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 gustaMe gusta
Es un tema muy interesante, gracias me sirvió de mucho, para aplicarlo a JSF.
Me gustaMe gusta
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 gustaMe gusta
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 gustaMe gusta
Hola me ayudo mucho tu tutorial, pero tengo una consulta he intentado hacer la conexión oracle 11g, pero sin exito,.
Gracias
Me gustaMe gusta