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

[SOLUCIONADO] Relaciones OneToMany Bidireccionales con Hibernate;

Estas en el tema de Relaciones OneToMany Bidireccionales con Hibernate; en el foro de Java en Foros del Web. Hola, estoy siguiendo este tutorial http://viralpatel.net/blogs/hibernate-one-to-many-annotation-tutorial/ para hacer una relación 1:N entre las tablas "message" y "messagestatus". Es simplemente una relación de entre una tabla ...
  #1 (permalink)  
Antiguo 17/10/2013, 11:27
 
Fecha de Ingreso: febrero-2006
Mensajes: 43
Antigüedad: 18 años, 9 meses
Puntos: 1
Relaciones OneToMany Bidireccionales con Hibernate;

Hola, estoy siguiendo este tutorial http://viralpatel.net/blogs/hibernate-one-to-many-annotation-tutorial/ para hacer una relación 1:N entre las tablas "message" y "messagestatus".

Es simplemente una relación de entre una tabla de mensaje y una tabla de los distintos estados por los que puede pasar un mensaje.

Mis tablas son:
Código PHP:
--
-- 
Estructura de tabla para la tabla `message_status`
--

CREATE TABLE IF NOT EXISTS message_status (
  
id tinyint(3unsigned NOT NULL AUTO_INCREMENT,
  
name char(25NOT NULL DEFAULT '',
  
PRIMARY KEY (id)
ENGINE=InnoDB  DEFAULT CHARSET=utf8;

--
-- 
Estructura de tabla para la tabla `messages`
--

CREATE TABLE IF NOT EXISTS `messages` (
  
id smallint(5unsigned NOT NULL AUTO_INCREMENT,
  
name char(150NOT NULL DEFAULT '',
  
email char(150NOT NULL DEFAULT '',
  
issue char(150NOT NULL DEFAULT '',
  
content text NOT NULL,
  
ip char(20NOT NULL DEFAULT '',
  
user_agent char(200NOT NULL DEFAULT '',
  
moment datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  
message_status_id tinyint(3unsigned NOT NULL DEFAULT '0',
  
PRIMARY KEY (id),
  
FOREIGN KEY (message_status_idREFERENCES message_status(idON DELETE CASCADE ON UPDATE CASCADE
ENGINE=InnoDB DEFAULT CHARSET=utf8
Mis clases:
Código PHP:
 @GeneratedValue
 
@Column(name="id")
 private 
long id;

 @
Column(name="name"
 @
NotEmpty(message="El Nombre es obligatorio") @Size(min=3max=150message="El Nombre debe tener entre 3 y 150 caracteres")
 private 
String name;
 
 @
Column(name="email")
 @
NotEmpty(message="El Email es obligatorio") @Email(message="El Email no es válido")
 private 
String email;
 
 @
Column(name="issue")
 @
NotEmpty(message="El Asunto es obligatorio") @Size(min=3max=150message="El Asunto debe tener entre 3 y 150 caracteres"
 private 
String issue;
 
 @
Column(name="content")
 @
NotEmpty(message="El Mensaje es obligatorio") @Size(min=3max=150message="El Mensaje debe tener entre 3 y 150 caracteres")
 private 
String content;
 
 @
Column(name="ip")
 private 
String ip;
 
 @
Column(name="user_agent")
 private 
String user_agent;
 
 @
Column(name="moment")
 @
Temporal(TemporalType.TIMESTAMP)
 private 
Date moment;
 
 @
ManyToOne
 
@JoinColumn(name="message_status_id")
 private 
MessageStatus messagestatus;
 
 
/**
  * 
  */
 
public Message() 
 {
        
 }
 

 
 
@
Entity
@Table(name="message_status")
public class 
MessageStatus {
 
 @
Id
 
@GeneratedValue
 
@Column(name="id")
 private 
long id;
 
 @
Column(name="name"
 @
NotEmpty(message="El Nombre es obligatorio") @Size(min=3max=150message="El Nombre debe tener entre 3 y 150 caracteres")
 private 
String name
 
 @
OneToMany(mappedBy="message_status")
 private 
Set<Messagemessages;
 
 public 
MessageStatus()
 {
  
 }
 
 public 
MessageStatus(String name)
 {
  
this.name name;
 } 
 

Mi controlador:

Código PHP:
   // Se obtiene la sesion
   
Session s HibernateUtil.getSession();
   
s.beginTransaction(); 
   
   
// Se salva en base de datos
   
MessageStatus ms = new MessageStatus("Status de prueba");
   
s.save(ms);
   
   
message.setMessagestatus(ms);
   
   
s.save(message);
   
s.getTransaction().commit();   
   
s.close(); 
No lo tengo hecho aún pero lo lógico sería que recupere un estado de la base de datos y inserto el mensaje. Ahora mismo inserto las dos cosas porque estoy haciendo pruebas.
El fallo viene dado al querer realizar una relación bidireccional, si comento las siguientes líneas de la clase messagestatus funciona correctamente:

@OneToMany(mappedBy="message_status")
private Set<Message> messages;

El error que se produce es un error 500 del servidor y pone lo siguiente:

Estado HTTP 500 - type Informe de Excepción mensaje descripción El servidor encontró un error interno () que hizo que no pudiera rellenar este requerimiento.excepción org.springframework.web.util.NestedServletExceptio n: Handler processing failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class com.omb.bets.model.hibernate.HibernateUtil
org.springframework.web.servlet.DispatcherServlet. triggerAfterCompletionWithError(DispatcherServlet. java:1259)
org.springframework.web.servlet.DispatcherServlet. doDispatch(DispatcherServlet.java:945)
org.springframework.web.servlet.DispatcherServlet. doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.p rocessRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.d oPost(FrameworkServlet.java:838)
javax.servlet.http.HttpServlet.service(HttpServlet .java:641)
org.springframework.web.servlet.FrameworkServlet.s ervice(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet .java:722)
</pre></p><p><b>causa raíz</b> <pre>java.lang.NoClassDefFoundError: Could not initialize class com.omb.bets.model.hibernate.HibernateUtil
com.omb.bets.web.pages.Contact.addContact(Contact. java:67)
sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Native MethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(De legatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.springframework.web.method.support.InvocableHa ndlerMethod.invoke(InvocableHandlerMethod.java:219 )
org.springframework.web.method.support.InvocableHa ndlerMethod.invokeForRequest(InvocableHandlerMetho d.java:132)
org.springframework.web.servlet.mvc.method.annotat ion.ServletInvocableHandlerMethod.invokeAndHandle( ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotat ion.RequestMappingHandlerAdapter.invokeHandleMetho d(RequestMappingHandlerAdapter.java:745)
org.springframework.web.servlet.mvc.method.annotat ion.RequestMappingHandlerAdapter.handleInternal(Re questMappingHandlerAdapter.java:686)
org.springframework.web.servlet.mvc.method.Abstrac tHandlerMethodAdapter.handle(AbstractHandlerMethod Adapter.java:80)
org.springframework.web.servlet.DispatcherServlet. doDispatch(DispatcherServlet.java:925)
org.springframework.web.servlet.DispatcherServlet. doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.p rocessRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.d oPost(FrameworkServlet.java:838)
javax.servlet.http.HttpServlet.service(HttpServlet .java:641)
org.springframework.web.servlet.FrameworkServlet.s ervice(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet .java:722)
</pre></p><p><b>nota</b> <u>La traza completa de la causa de este error se encuentra en los archivos de diario de Apache Tomcat/7.0.14.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.14</h3
  #2 (permalink)  
Antiguo 18/10/2013, 05:58
 
Fecha de Ingreso: febrero-2006
Mensajes: 43
Antigüedad: 18 años, 9 meses
Puntos: 1
Respuesta: Relaciones OneToMany Bidireccionales con Hibernate;

Hola, nadie que sepa porque se produce este error o que puede estar pasando??

Un saludo y gracias.
  #3 (permalink)  
Antiguo 18/10/2013, 10:38
 
Fecha de Ingreso: marzo-2012
Ubicación: Argentina
Mensajes: 111
Antigüedad: 12 años, 8 meses
Puntos: 12
Respuesta: Relaciones OneToMany Bidireccionales con Hibernate;

Hola ;

Y la clase HibernateUtil ?

Posteala hay alguna dependencia que falta

Saludos.
  #4 (permalink)  
Antiguo 18/10/2013, 14:36
 
Fecha de Ingreso: febrero-2006
Mensajes: 43
Antigüedad: 18 años, 9 meses
Puntos: 1
Respuesta: Relaciones OneToMany Bidireccionales con Hibernate;

Muchas gracias por interesarte:

Código PHP:
package com.omb.bets.model.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

/**
 * Clase de utilidad para obtener la sesion de hibernate.
 * 
 * @author Chuidiang
 * 
 */
public class HibernateUtil {

    private static final 
SessionFactory sessionFactory;

    static {
        try {
         
// Si no ponemos fichero, intenta cargar "/hibernate.cfg.xml" en el raiz
            //sessionFactory = new AnnotationConfiguration().configure(new File("hibernate.cfg.xml")).buildSessionFactory();
            
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

        } catch (
Throwable ex) {
            
// Log exception!
            
throw new ExceptionInInitializerError(ex);
        }
    }

    public static 
Session getSession() throws HibernateException {
        return 
sessionFactory.openSession();
    }

No creo que sea culpa nada de la clase HibernateUtil, ya que sólo carga el fichero xml de configuración y obtiene una sesion. Y para insertar en las dos tablas funciona.

El problema es al descomentar la anotación de la relación:
@OneToMany(mappedBy="message_status")
private Set<Message> messages;

En el ejemplo está mal representado lo que quiero hacer. Tengo un formulario de contacto que inserta el mensaje en la tabla message. Como hay que insertarlo con un estado, por ejemplo "No leído", tendríamos que recuperar dicho estado mediante id. Asignarselo al mensaje e insertarlo en la tabla messages.

Soy bastante novato en spring por el momento y no se si estoy haciendolo bien. ¿Para este tipo de relación conviene una relacion bidireccional?¿Penalizan el rendimiento de la aplicación?

Un saludo y muchas gracias.
  #5 (permalink)  
Antiguo 22/10/2013, 09:32
 
Fecha de Ingreso: febrero-2006
Mensajes: 43
Antigüedad: 18 años, 9 meses
Puntos: 1
Respuesta: Relaciones OneToMany Bidireccionales con Hibernate;

Me fallaban 3 cositas:

1º) En el pom.xml me faltaba:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>ejb3-persistence</artifactId>
<version>1.0.2.GA</version>
</dependency>

2º) En el dispatcher-servlet.xml me faltaba declarar el bean:
<bean id="messagestatusdao" class="com.omb.bets.model.message.MessageStatusDao " />

3º) En la clase MessageStatus había el siguiente error.
@OneToMany(mappedBy="message_status")
por
@OneToMany(mappedBy="messagestatus")

Muchas gracias.

Etiquetas: clase, relaciones, string
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




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