Pregunta

Nuestra aplicación Java tiene alrededor de 100 clases asignadas a una base de datos (SQL Server o MySQL). Estamos utilizando Hibernate como nuestra ORM (con archivos de mapeo XML).

especificar restricciones FOREIGN KEY en nuestro esquema de base de datos. La mayoría de nuestras limitaciones FOREIGN KEY también especifican ON DELETE CASCADE.

Hemos comenzado recientemente que permite el almacenamiento en caché de Hibernate segundo nivel (por entidades populares y colecciones) para mitigar algunos problemas de rendimiento.

El rendimiento ha mejorado desde que hemos habilitado el segundo nivel de caché. Sin embargo, también hemos empezado a encontrar ObjectNotFoundExceptions.

Parece que los ObjectNotFoundExceptions están ocurriendo debido a que la base de datos está eliminando filas de la tabla debajo de Hibernate. Por ejemplo, cuando borramos un Parent con Hibernate, el esquema de base de datos ON DELETE CASCADE a ninguna entidad Child. Esto sucede, obviamente, sin el conocimiento hiberna, por lo que no tienen la oportunidad de actualizar el segundo nivel de caché (y eliminar cualquier entidad Child eliminados).

Creemos que la solución a este problema es eliminar ON DELETE CASCADE de nuestro esquema de base de datos (pero mantener las FOREIGN KEYs). En su lugar, tenemos que configurar Hibernate para dependencias Child de borrado con SQL borrado normal, que también hará actualización Hibernate el segundo nivel de caché. Algunas pruebas limitadas ha demostrado que este enfoque parece funcionar.

quería obtener alguna información en esta comunidad. ¿Hay alternativas mejores (?) Soluciones a nuestro problema? ¿Cómo los demás manejar esta situación? En general, ¿cuáles son las ventajas y desventajas que deben ser considerados cuando se utiliza ON DELETE CASCADE en un esquema de base de datos con Hibernate?

Gracias.

¿Fue útil?

Solución

Si siempre va a eliminar a través de su programa, que desea tomar la restricción de la base de datos y decirle al objeto de hibernación en ON DELETE CASCADE para cuidar de los chicos relacionados.

Por otro lado, si se va a eliminar los objetos a veces en su aplicación de java, y algunas veces a su nivel de base de datos, el resultado final será con los datos que cuelga raro. En este caso puede que tenga que mirar en un enfoque más complicado .. Usted no estaba claro si este era el caso, por lo que no va a entrar en más detalles aquí.

Otros consejos

Si está utilizando ON DELETE CASCADE en su base de datos que necesita para contar hibernación, así:

@OnDelete(action = OnDeleteAction.CASCADE)

esto es diferente de

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)

Este último está diciendo hibenrate algo acerca de la relación en memoria. el primero optimiza sentencias SQL de eliminación en el nivel de base de datos. Hibernate necesita saber que el PP es el cuidado de niño de borrado.

Tome un vistazo a este sitio para una buena explicación de este mecanismo:

http://eddii.wordpress.com/2006 / 11/16 / hibernate-on-deletecascade rendimiento /

y el comentario del programador de esta función:

http: //www.mail-archive. com/hibernate-devel@lists.sourceforge.net/msg03801.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top