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(3) unsigned NOT NULL AUTO_INCREMENT,
name char(25) NOT 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(5) unsigned NOT NULL AUTO_INCREMENT,
name char(150) NOT NULL DEFAULT '',
email char(150) NOT NULL DEFAULT '',
issue char(150) NOT NULL DEFAULT '',
content text NOT NULL,
ip char(20) NOT NULL DEFAULT '',
user_agent char(200) NOT NULL DEFAULT '',
moment datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
message_status_id tinyint(3) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (id),
FOREIGN KEY (message_status_id) REFERENCES message_status(id) ON 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=3, max=150, message="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=3, max=150, message="El Asunto debe tener entre 3 y 150 caracteres")
private String issue;
@Column(name="content")
@NotEmpty(message="El Mensaje es obligatorio") @Size(min=3, max=150, message="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=3, max=150, message="El Nombre debe tener entre 3 y 150 caracteres")
private String name;
@OneToMany(mappedBy="message_status")
private Set<Message> messages;
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