Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/10/2013, 11:27
oskrok
 
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