2008-12-23 8 views
5

Estoy tratando de hacer una aplicación que mantenga un modelo de objetos sincronizado con una base de datos al observar todos los cambios y luego persistir de inmediato en los objetos en cuestión. Muchos de los objetos en el modelo tienen hijos en listas grandes o árboles.Opciones de cascada de JPA en tiempo de ejecución

Cuando cargo un objeto de la base de datos, confío en una relación en cascada unidireccional para recuperar todos sus elementos secundarios e incluirlos en la aplicación.

Sin embargo, es posible alterar un campo en el objeto principal que requiere persistencia y puedo determinar que ninguno de los elementos secundarios está afectado. Así que me gustaría persistir el padre, sin golpear la base de datos con todo el niño en cascada persiste.

por ejemplo

@Entity 
public class Parent { 

    @OneToMany(cascade=CascadeType.ALL) 
    public List children; 

} 

¿Cómo puedo reemplazar la opción de cascada cuando persisto un objeto padre? ¿O debería simplemente configurarlo para ACTUALIZAR y asegurarme de que nunca necesite una persistencia en cascada?

Respuesta

4

La lectura de los objetos de la base de datos y su persistencia dependen de dos anotaciones diferentes.

Cuando carga un objeto, también obtendrá el otro extremo de las relaciones (FetchType.EAGER) ansiosas, según lo definido por la propiedad fetch en la relación.

Dependiendo de su proveedor de JPA, puede tener opciones para anular este comportamiento. EclipseLink, a través de la increíblemente útil QueryHint.BATCH, ciertamente lo hace.

Cuando persiste, elimina o actualiza, el tipo de cascada es lo que es relevante.

Por lo tanto, pierda la cascada, mantenga la búsqueda y el problema resuelto.

Personalmente creo que en cascada todo está buscando problemas, pero las opiniones pueden variar.

Un proveedor JPA decente ya tendrá un esquema de caché bastante sofisticado (configurable). Tal vez deberías preguntarte por qué estás reinventando esa rueda en particular.

¿Es un problema de actualizaciones asincrónicas puramente por rendimiento? ¿O es otra cosa la razón?

+0

Es una aplicación independiente con la base de datos en la misma máquina o un servidor cercano. Se requiere que todo el modelo esté en la memoria para que el usuario pueda jugar con él. Estoy intentando que el resultado de todas las acciones del usuario persista para que nunca tengan que hacer clic en "guardar". – Cogsy

Cuestiones relacionadas