Vamos a por la segunda parte del post. A modo de recordatorio, vamos a crear una aplicación para gestionar nuestros contactos utilizando para ello Maven, Spring MVC e Hibernate. En el anterior post creamos el árbol de directorios de la aplicación utilizando Maven, además añadimos las dependencias y por ultimo creamos la Base de datos (MySQL) .
Aquí dejo de nuevo el árbol de como debe quedar nuestra aplicación, esto nos servirá para no perdernos mientras vamos creando archivos.
Ahora queda configurar un poco el entorno para que Hibernate funcione correctamente, así que vamos a hacer lo siguiente:
Creamos un archivo dentro de la carpeta resources vamos a crear el archivo hibernate.cfg.xml
Este archivo lo que hace es «decirle» a Hibernate que la clase que tiene que mapear se encuentra en com.jesusl.formContact
Aquí tenemos el archivo: /demoweb-hibernate/src/main/resources/hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <mapping class="com.jesuslc.contact.form.Contact" /> </session-factory> </hibernate-configuration>
Ahora vamos a crear un archivo de propiedades donde pondremos las «etiquetas» que vamos a usar en toda la aplicación. Es decir, si en un futuro queremos cambiar «Apellido» por otra etiqueta como «Apellidos» o incluso queremos traducir nuestra aplicación nos será más fácil si todos los elementos a modificar/traducir están en el mismo archivo.
Por ello vamos a crear un archivo dentro de resources llamado messages_es.properties donde tendremos pares etiqueta:significado.
/demoweb-hibernate/src/main/resources/messages_es.properties
label.firstname=Nombre label.lastname=Apellidos label.email=Email label.telephone=Teléfono label.addcontact=Añadir contacto label.menu=Menu label.title=Mi agenda Hibernate label.footer=© jesuslc.com
Ahora vamos a configurar la base de datos MySQL para ello lo que vamos ha hacer es crear también un archivo .properties, llamado jdbc.properties. En él están los datos e acceso a la base de datos.
/demoweb-hibernate/src/main/webapp/WEB-INF/jdbc.properties
jdbc.driverClassName= com.mysql.jdbc.Driver jdbc.dialect=org.hibernate.dialect.MySQLDialect jdbc.databaseurl=jdbc:mysql://localhost:3306/ContactManager jdbc.username=XXXXX jdbc.password=XXXXXX
sss
En este archivo indicamos cómo se llama la base de datos (ContactManager), que tipo de base de datos es (MySQL) y cual es el usuario y la contraseña para acceder al la base de datos.
Ahora vamos a por la parte más importante y que puede traer más quebraderos de cabeza si no la hacemos bien. Son los archivos web.xml y spring-servlet.xml
En web.xml archivo es donde vamos a configurar el nombre del servlet. Este servlet, que se llama spring en nuestro caso, es el que se encarga dede recibir todas las peticiones y redirigirlas a los controladores. El apartado <servlet-mapping> indica qué peticiones del navegador se deben redirigir a qué servlet, en concreto, cualquier petición de cualquier fichero () se redirigirá al servlet spring.
Aquí vemos /demoweb-hibernate/src/main/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>Spring3-Hibernate</display-name> <welcome-file-list> <welcome-file>list.html</welcome-file> </welcome-file-list> <servlet> <servlet-name>spring</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
El servlet org.springframework.web.servlet.DispatcherServlet también se encarga de cargar todos los beans de Spring Framework que le indiquemos. Para ello, carga un fichero spring-servlet.xml situado en el directorio WEB-INF, junto a web.xml y carga los beans que se indiquen en ese fichero.
/demoweb-hibernate/src/main/webapp/WEB-INF/spring-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <context:annotation-config /> <context:component-scan base-package="com.jesuslc.contact" /> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="classpath:messages" /> <property name="defaultEncoding" value="UTF-8" /> </bean> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" p:location="/WEB-INF/jdbc.properties" /> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" /> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> <property name="configurationClass"> <value>org.hibernate.cfg.AnnotationConfiguration</value> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${jdbc.dialect}</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <tx:annotation-driven /> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> </beans>
Vamos a comentar un poco el fichero.
- id=»jspViewResolver» donde se encuentra la vista de nuestros modelos MVC.
- id=»propertyConfigurer» aquí le indicamos que tenemos un archivo con propiedades en este caso están las propiedades de conexión a la base de datos
- id=»dataSource» en este caso indica los datos de acceso para conectarse a la BD, ya que la base de datos será nuestra «fuente de datos»
- id=»sessionFactory» Aquí le «decimos» a Spring MVC que vamos a utilizar Hibernate y le decimos donde tiene que leer el archivo de «mapeo» (hibernate.cfg.xml)
Hasta aquí la configuración, ahora solo nos queda tirar código para que nuestra aplicación sea definitiva.
Actualización
Aquí la parte 1: https://jesuslc.com/2013/03/19/poco-a-poco-con-maven-spring-hibernate/
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
Hola Jesús, muy bueno los pasos que estas llevando. Tenia una duda, los datos del archivo jdbc.properties también pueden ser expuestos en hibernate.cfg.xml, pero en ese caso cómo se haría la referencia. Existirá una tercera parte o ya depende de uno llegar a completar los pasos faltantes. Muchos saludos.
Me gustaMe gusta
Hola Aquiles,
Sí, los datos que estan en el archivo jdbc.properties, pueden ponerse dentro de hibernate.cfg.xml con solo crear atributos dentro del archivo XML más o menos así:
com.mysql.jdbc.Driver
………..
El inconveniente que tiene hacerlo así es que se puede hacer complicado navegar por el XML y cambiar su configuración. Yo he optado por desacoplar todo lo que es la parte de configuración y contraseñas (archivo jdbc.properties) de loo que es el mapeo en sí (hibernate.cfg,xml)
Por otro lado comentarte que sí, que habrá una tercera parte que saldrá el martes. Allí ya nos pondremos con código y terminaremos el ejemplo que aparece en la parte uno. Una agenda de contactos 😉
Un saludo.
Me gustaMe gusta
Hola jesuslc, oye tu me podrías ayudar con la configuracion de hibernate para el tema de los schemas en los diferentes ambientes (DEV, QA, PROD, etc…) De antemano gracias!!!
Me gustaMe gusta
Hola Jonathan,
No se si seré de mucha ayuda (no soy un experto) pero intentaré ayudarte en lo que pueda.
Comenta tus dudas y a ver que pasa.
Si lo prefieres utiliza el «nuevo» formulario de contacto 😉
Un saludo!
Me gustaMe gusta
Pues la dúda principal y la que me esta quebrando la cabeza es la siguiente:
Como puedo configurar dentro de mi archivo hibernate.cfg.xml, para que esté tome el schema de la BD a la cual estoy conectado(CurrencySchema), si me explico???
Primero quisiera saber si esto es posible y de serlo, como sería la configuración. Estuve revisando y me encontre con la tag my_schema, en donde debe ser el nombre del schema con el cual vas a trabajar con la BD.
Pero lo que realmente necesito, es saber si es posible hacer que contenga el nombre del schema que actualmente esta siendo utilizado y no casarlo en código duro.
Saludos.
Me gustaMe gusta
El tema schemas e Hibernate es un mundo, solo tienes que buscar en google y ver que las primeras posiciones de las búsquedas son todas de StackOverFlow.
Para utilizar un schema en Hibernate hay muchas opciones: – –una de ellas por ejemplo es en el mapeo. En la clase Java indicas cual es el schema que quieres utilizas, aquí tienes una referencia a stackoverflow:
http://stackoverflow.com/questions/3024443/accessing-inter-schema-tables-and-relations-in-hibernate
-otra opción es indicar el schema en hibernate.cfg.xml, sería algo así: default_schema
Aquí te dejo una referencia por si te sirve de ayuda: http://gregnason.ca/content/configuring-hibernate-use-multiple-database-schemas
Creo que no he entendido bien la pregunta del todo, ya qe tu al conectarte indicas a que esquema quieres conectarte. SI lo que tienes son 3 entornos (PROD, QA, DEV) lo que podrías tene serían 3 «schemas» e indicar a cual te quieres conectar.
Si el ejemplo del post, yo utilizo un archivo de texto plano (.properties) para qeu lso cambios sean mucho más rápidos, ya que es más facil modificar un archivo con 3 lineas que hibernate.cfg.xml
No se si esto te ha servido de ayuda o te ha liado más, pero si tienes cualquier duda no dudes en comentarlo.
Un saludo
Me gustaMe gusta