Java - Eliminar en Hibernate

   
Vista:

Eliminar en Hibernate

Publicado por Mercedes (125 intervenciones) el 22/07/2008 20:18:55
Buenas tardes!!

Espero que alguien pueda echarme una mano, porque no consigo encontrar la solución...

Estoy intentando eliminar una fila de mi base de datos (MySql) con Hibernate, y resulta que este objeto tiene relaciones con otras tablas (claves foráneas).

Bien, el comportamiento que deseo es que si elimino por ejemplo, una empresa, se eliminen a su vez todo lo relacionado con ella, como clientes, presupuestos, proveedores... Para ello, he utilizado el atributo cascade="delete" en los <set>.

Al intentar eliminarlo me salta el siguiente error:

org.hibernate.PropertyValueException: not-null property references a null or transient value: es.proyecto.hibernate.mapeos.Empresa.usuarios

at org.hibernate.engine.Nullability.checkNullability( Nullability.java:72)

at org.hibernate.event.def.DefaultDeleteEventListener .deleteEntity(DefaultDeleteEventListener.java:173)

at org.hibernate.event.def.DefaultDeleteEventListener .onDelete(DefaultDeleteEventListener.java:110)

at org.hibernate.impl.SessionImpl.fireDelete(SessionI mpl.java:761)

at org.hibernate.impl.SessionImpl.delete(SessionImpl. java:739)

at es.proyecto.hibernate.dao.EmpresaDAO.eliminarEmpre sa(EmpresaDAO.java:191)

at es.proyecto.hibernate.bl.EmpresaBL.eliminarEmpresa (EmpresaBL.java:32)

at es.proyecto.struts.action.EmpresaAction.eliminarEm presa(EmpresaAction.java:229)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Native MethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(De legatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:585)

at org.apache.struts.actions.DispatchAction.dispatchM ethod(DispatchAction.java:274)

at org.apache.struts.actions.DispatchAction.execute(D ispatchAction.java:194)

at org.apache.struts.action.RequestProcessor.processA ctionPerform(RequestProcessor.java:419)

at org.apache.struts.action.RequestProcessor.process( RequestProcessor.java:224)

at org.apache.struts.action.ActionServlet.process(Act ionServlet.java:1194)

at org.apache.struts.action.ActionServlet.doGet(Actio nServlet.java:414)

at javax.servlet.http.HttpServlet.service(HttpServlet .java:690)

at javax.servlet.http.HttpServlet.service(HttpServlet .java:803)

at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:269)

at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:188)

at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:210)

at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:174)

at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:127)

at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:117)

at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:108)

at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:151)

at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:870)

at org.apache.coyote.http11.Http11BaseProtocol$Http11 ConnectionHandler.processConnection(Http11BaseProt ocol.java:665)

at org.apache.tomcat.util.net.PoolTcpEndpoint.process Socket(PoolTcpEndpoint.java:528)

at org.apache.tomcat.util.net.LeaderFollowerWorkerThr ead.runIt(LeaderFollowerWorkerThread.java:81)

at org.apache.tomcat.util.threads.ThreadPool$ControlR unnable.run(ThreadPool.java:685)

at java.lang.Thread.run(Thread.java:595)


Me imagino que haya gente que si que haya podido realizar esta operación pues no me parece que sea nada extraño.

Muchas gracias

Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
información
Otras secciones de LWP con contenido de Java
- Código fuente de Java
- Cursos de Java
- Temas de Java
- Chat de Java
información
Códigos de Java
- Editor de texto
- HILOS (Threads) en JAVA
- Minitienda

RE:Eliminar en Hibernate

Publicado por alejandro (3 intervenciones) el 22/07/2008 21:37:06
probaste con cascade all.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Eliminar en Hibernate

Publicado por Mercedes (125 intervenciones) el 28/07/2008 20:19:15
Si, he probado con cascade="delete", cascade="all-delete-orphan"

Una duda, ¿debo poner el cascade en los dos extremos de la relación?

La relación es la siguiente, un usuario puede tener varias empresas, por lo que en la tabla empresa, existe un atributo que es una clave que hace referencia al usuario.

El problema que existe, o lo que entiendo yo, es que se está intentando eliminar una empresa, y el atributo usuario no puede ser null, y por eso falla, pero no entiendo cómo solucionarlo..

Muchas gracias

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Eliminar en Hibernate

Publicado por Juan A. (2 intervenciones) el 17/08/2008 00:09:43
Usa las anotaciones. Cómo? Te explico.

Por ejemplo vamos a suponer que estamos en la Clase Empresa, precisamente donde tienes los set/get, pues ahí antes del getClientes() añadimos la sgte anotación.

//Lo que se pretende con esta anotación es que se borren todos los clientes cuando se //elimina la empresa, la tabla "EmpresaClientes" es una JoinTable que tendrá dos campos: "emp_id" y "cliente_id"

private List<EmpCliente> clientes;

@OneToMany(cascade=CascadeType.ALL , fetch=FetchType.EAGER)
@JoinTable(
name="EmpresaClientes",
joinColumns={@JoinColumn(name="emp_id")},
inverseJoinColumns= @JoinColumn(name="cliente_id")
)

public List<EmpCliente> getClientes() {
return clientes;
}

Ojalá te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Eliminar en Hibernate

Publicado por Juan A. (2 intervenciones) el 17/08/2008 00:13:31
Y se me olvidaba no olvides las librerías correspondientes:

import javax.persistence.CascadeType;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;

Más info de anotaciones en: http://www.hibernate.org/397.html

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar