Foros del Web » Programación para mayores de 30 ;) » Java »

Mapeo de tabla en Spring con Hibernate

Estas en el tema de Mapeo de tabla en Spring con Hibernate en el foro de Java en Foros del Web. Hola que tal. Estoy aprendiendo Hibernate, sumándolo a los conocimientos que tengo de Spring 3. Para lo estoy usando de guia este articulo . En ...
  #1 (permalink)  
Antiguo 30/01/2013, 14:07
 
Fecha de Ingreso: enero-2012
Ubicación: Santiago de Surco, Lima - Perú
Mensajes: 266
Antigüedad: 12 años, 2 meses
Puntos: 57
Mapeo de tabla en Spring con Hibernate

Hola que tal.

Estoy aprendiendo Hibernate, sumándolo a los conocimientos que tengo de Spring 3.

Para lo estoy usando de guia este articulo. En el cual, el autor muestra el paso 1 como queda el mapeo de la tabla "Alumno" y al pie de este código, menciona lo siguiente:

Cita:
De todas maneras hay multitud de herramientas que generan este código utilizando reverse enginering. Así que símplemente hay que quedarse con el concepto.
Ese párrafo frenó el desarrollo de mi aplicación con fines didácticos. No he conseguido alguna herramienta que me genere las anotaciones en el bean. Y cabe resaltar que el autor esta desarrollando ese ejemplo sin la utilización de JPA.

Con el fin de lograr un bean con las anotaciones necesarias. Hice uso de JPA para generar un JAP Entity for table pero no conseguí que me generara un bean con todas las anotaciones que se muestran el articulo. Obtuve esto de una tabla que tengo en mi DB:
Código Java:
Ver original
  1. package com.spring.model;
  2.  
  3. import java.io.Serializable;
  4. import java.util.List;
  5. import javax.persistence.*;
  6. import org.hibernate.annotations.Entity;
  7.  
  8. //import model.Usuario;
  9.  
  10.  
  11. public class Persona implements Serializable {
  12.     private static final long serialVersionUID = 1L;
  13.  
  14.     @Id
  15.     private Integer idpersona;
  16.  
  17.     private Boolean estado;
  18.  
  19.     private String nombre;
  20.  
  21.     //bi-directional many-to-one association to Usuario
  22.     @OneToMany(mappedBy="persona")
  23.     private List<Usuario> usuarios;
  24.  
  25.     public Persona() {
  26.     }
  27.  
  28.     public Integer getIdpersona() {
  29.         return this.idpersona;
  30.     }
  31.  
  32.     public void setIdpersona(Integer idpersona) {
  33.         this.idpersona = idpersona;
  34.     }
  35.  
  36.     public Boolean getEstado() {
  37.         return this.estado;
  38.     }
  39.  
  40.     public void setEstado(Boolean estado) {
  41.         this.estado = estado;
  42.     }
  43.  
  44.     public String getNombre() {
  45.         return this.nombre;
  46.     }
  47.  
  48.     public void setNombre(String nombre) {
  49.         this.nombre = nombre;
  50.     }
  51.  
  52.     public List<Usuario> getUsuarios() {
  53.         return this.usuarios;
  54.     }
  55.  
  56.     public void setUsuarios(List<Usuario> usuarios) {
  57.         this.usuarios = usuarios;
  58.     }
  59. }
  60. /*Se trata de una tabla que esta relacionada con otra: usuario.
  61. como se puede observar las anotaciones son pocas y no estan como el ejemplo del articulo.
  62. */



Pues ese es mi problema. El autor menciona que símplemente hay que quedarse con el concepto. refiriendose a dicho bean, con lo cual queda claro que esas anotaciones no se hacen a "mano" si no con una de las diversas herramientas que el asegura generan el codigo pero que yo aun no he podido encontrar.

Si alguien tiene la experiencia de haber mapeado tablas con anotaciones en los beans en vez de usar xml con hibernate. Me seria de gran ayuda alguna recomendación para continuar con el desarrollo de este ejemplo.
  #2 (permalink)  
Antiguo 01/02/2013, 03:15
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 1 mes
Puntos: 78
Respuesta: Mapeo de tabla en Spring con Hibernate

En el fichero de configuración le has dicho que escanee los paquetes donde tienes las anotaciones?

En LocalSessionFactoryBean, en la propiedad packagesToScan, pasarle una lista de packages donde tienes las clases que te mapeen con las tablas.

De este modo, cuando se levante la fábrica de Spring en vez de levantar los xml (que no los tienes definidos porque no los vas a usar), se mirará las clases (con anotaciones) que le indiques y te las deberá mapear.


Saludos.
  #3 (permalink)  
Antiguo 01/02/2013, 10:13
 
Fecha de Ingreso: enero-2012
Ubicación: Santiago de Surco, Lima - Perú
Mensajes: 266
Antigüedad: 12 años, 2 meses
Puntos: 57
Información Respuesta: Mapeo de tabla en Spring con Hibernate

Justamente ahi hay un problema ...
Código XML:
Ver original
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  4.     xmlns:tx="http://www.springframework.org/schema/tx"
  5.     xsi:schemaLocation="
  6.        http://www.springframework.org/schema/beans
  7.        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  8.        http://www.springframework.org/schema/context
  9.        http://www.springframework.org/schema/context/spring-context-3.0.xsd
  10.        http://www.springframework.org/schema/tx
  11.        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
  12.     <context:component-scan base-package="com.spring" />
  13.  
  14.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
  15.         destroy-method="close">
  16.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  17.         <property name="url" value="jdbc:mysql://localhost:3306/testid" />
  18.         <property name="username" value="root" />
  19.         <property name="password" value="" />
  20.     </bean>
  21.     <!-- context:property-placeholder location="com/spring/resources/database.properties"/ -->
  22.     <bean id="sessionFactory"
  23.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
  24.         lazy-init="true">
  25.         <property name="dataSource" ref="dataSource" />
  26.         <property name="hibernateProperties">
  27.             <props>
  28.                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
  29.                 <prop key="hibernate.hbm2ddl.auto">auto</prop>
  30.                 <prop key="hibernate.show_sql">false</prop>
  31.                 <prop key="hibernate.c3p0.min_size">5</prop>
  32.                 <prop key="hibernate.c3p0.max_size">20</prop>
  33.                 <prop key="hibernate.c3p0.timeout">300</prop>
  34.                 <prop key="hibernate.c3p0.max_statements">50</prop>
  35.                 <prop key="hibernate.c3p0.idle_test_period">3000</prop>
  36.             </props>
  37.         </property>
  38.         <!-- Paquete donde se encuentran los beans de mapeo de las tablas -->
  39.         <!-- <property name="packagesToScan" value="com.spring.model"/> -->
  40.     </bean>
  41.     <bean id="transactionManager"
  42.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  43.         <property name="sessionFactory" ref="sessionFactory" />
  44.     </bean>
  45. </beans>
En la linea 39 esta propiedad me marca como error, por eso la tuve que comentar. No estoy seguro si tiene que ver con el tema de versiones.

Ey, un momento. Pero entonces como se generan las anotaciones, creo que necesitaré entender el proceso porque creo haber retrocedido en entender esto.
  #4 (permalink)  
Antiguo 01/02/2013, 10:25
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 1 mes
Puntos: 78
Respuesta: Mapeo de tabla en Spring con Hibernate

Donde tienes el packageToScan es donde tienes que poner todos los packages que contienen tus clases con las anotaciones.

Tú esto lo tienes comentado. Ahora mismo cuando se levanta tu fábrica, no sabe donde tiene las tablas (clases).
  #5 (permalink)  
Antiguo 01/02/2013, 11:13
 
Fecha de Ingreso: enero-2012
Ubicación: Santiago de Surco, Lima - Perú
Mensajes: 266
Antigüedad: 12 años, 2 meses
Puntos: 57
Respuesta: Mapeo de tabla en Spring con Hibernate

packageToScan me marca como error en el editor (uso STS) :

Cita:
Attribute : name
The name of the property, following JavaBean naming conventions.
y en la consola:

Cita:
Caused by: org.springframework.beans.NotWritablePropertyExcep tion: Invalid property 'packagesToScan' of bean class [org.springframework.orm.hibernate3.LocalSessionFac toryBean]: Bean property 'packagesToScan' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
at org.springframework.beans.BeanWrapperImpl.setPrope rtyValue(BeanWrapperImpl.java:1012)
at org.springframework.beans.BeanWrapperImpl.setPrope rtyValue(BeanWrapperImpl.java:857)
at org.springframework.beans.AbstractPropertyAccessor .setPropertyValues(AbstractPropertyAccessor.java:76)
at org.springframework.beans.AbstractPropertyAccessor .setPropertyValues(AbstractPropertyAccessor.java:58)
at org.springframework.beans.factory.support.Abstract AutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1338)
... 63 more
Justamente comenté de dicho error en el mensaje anterior.
  #6 (permalink)  
Antiguo 01/02/2013, 11:24
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 1 mes
Puntos: 78
Respuesta: Mapeo de tabla en Spring con Hibernate

Yo uso tambien STS, y no me da problemas.

Prueba de ponerlo así: (por probar, porque no lo entiendo)

Código XML:
Ver original
  1. <property name="packagesToScan">
  2. <list>
  3. <value>com.paquete.tables</value>
  4. </list>
  5. </property>


Edito: Yo uso Hibernate4, tú el 3. Es solo una apreciación.
Saludos
  #7 (permalink)  
Antiguo 01/02/2013, 12:57
 
Fecha de Ingreso: enero-2012
Ubicación: Santiago de Surco, Lima - Perú
Mensajes: 266
Antigüedad: 12 años, 2 meses
Puntos: 57
Respuesta: Mapeo de tabla en Spring con Hibernate

Gracias, tu apreciación resolvio el problema de packageToScan (que mostraba error). Actualice´a Hibernate 4.

Pero ahora al ejecutar mi aplicación me muestra este error:

Cita:
SEVERE: Excepción enviando evento inicializado de contexto a instancia de escuchador de clase org.springframework.web.context.ContextLoaderListe ner
org.springframework.beans.factory.BeanCreationExce ption: Error creating bean with name 'transactionManager' defined in ServletContext resource [/WEB-INF/spring-application-context.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationExce ption: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring-application-context.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/hibernate/context/spi/CurrentSessionContext

.
.
.
Caused by: org.springframework.beans.factory.BeanCreationExce ption: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring-application-context.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/hibernate/context/spi/CurrentSessionContext
En mi xml del segundo mensaje, solo descomenté la linea 39. cabe aclarar que mis beans estan en "com.spring.model" indicado en el packageToScan.

Dejo el codigo de los archivos relevantes:
Código Java:
Ver original
  1. package com.spring.dao.impl;
  2.  
  3. import java.util.List;
  4.  
  5. import org.hibernate.SessionFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Repository;
  8.  
  9. import com.spring.dao.PersonaDao;
  10. import com.spring.model.Persona;
  11.  
  12. public class PersonaDaoImpl implements PersonaDao {
  13.  
  14.     @Autowired
  15.     private SessionFactory sessionFactory;
  16.  
  17.     public List<Persona> getPersonsList() {
  18.         @SuppressWarnings("unchecked")
  19.         List<Persona> personas = sessionFactory.getCurrentSession()
  20.                 .createQuery("from persona").list();
  21.         return personas;
  22.     }
  23. }

Código Java:
Ver original
  1. package com.spring.controller;
  2.  
  3. import java.util.List;
  4.  
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.ui.Model;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9.  
  10. import com.spring.model.Persona;
  11. import com.spring.service.PersonaService;
  12.  
  13. @Controller
  14. public class PersonaController {
  15.    
  16.     @Autowired
  17.     private PersonaService personaService; //interface
  18.    
  19.     @RequestMapping("/inicio.htm")
  20.     public void inicio() {
  21.         // show the homepage
  22.     }
  23.    
  24.     @RequestMapping("/personList.htm")
  25.     public void personList(Model model) {
  26.         List<Persona> personas = personaService.getPersonsList();
  27.         model.addAttribute("personas", personas);
  28.     }
  29. }

Y este es mi otro xml
Código XML:
Ver original
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.    xmlns:context="http://www.springframework.org/schema/context"
  5.    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  6.               http://www.springframework.org/schema/context         http://www.springframework.org/schema/context/spring-context-3.0.xsd">
  7.  
  8.     <context:component-scan base-package="com.spring"/>
  9.    
  10.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  11.         <property name="prefix" value="/WEB-INF/views/"/>
  12.         <property name="suffix" value=".jsp"/>
  13.     </bean>
  14. </beans>

En cuanto a los demás ficheros, estoy siguiendo la mista estructura del articulo que cité en primer mensaje. Las unicas diferencias son en el nombre de dos package: en el articulo "facade" y en mi aplicación "service", como tambien en "beans" y "model" en el mio. Aquí una imagen.


Que es lo que no estoy haciendo bien. Te agradecería que me ayudes a descubrirlo.
  #8 (permalink)  
Antiguo 03/02/2013, 04:00
 
Fecha de Ingreso: febrero-2011
Mensajes: 672
Antigüedad: 13 años, 1 mes
Puntos: 78
Respuesta: Mapeo de tabla en Spring con Hibernate

Veo que se te queja de "transactionManager".

Para usar métodos transaccionales debes indicar en los métodos o en la clase que todos sus métodos serán transaccionales, normalmente en la capa de servicio (@transactional).

Lo tienes definido?

Saludos.

Etiquetas: hibernate, mapeo, programa, spring, string, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 14:05.