java hibernate jpa orm jpa-2.0

java - ¿Cómo comprobar si la entidad en Hibernate está sucia?



jpa orm (3)

¿Cómo verificar si la entidad en Hibernate está en estado sucio? Es decir, quiero configurar UpdatedBy y UpdatedAt solo si algún campo ha cambiado. Entonces, ¿puedo hacer la comprobación de objetos manualmente comparando cada campo en 2 objetos, pero puede existir alguna forma más elegante de hacerlo?

Además, ¿hibernación hace que la entidad se dirty si configuro en el campo del objeto el mismo valor que tenía antes? Es decir:

String name = myEntity.getName() myEntity.setName(name);

EDITAR:

Pero también tengo otro problema: tengo una entidad con colecciones anidadas, por lo que si solo he cambiado el elemento en esa colección, quiero configurar UpdatedBy solo en ese elemento de la colección, pero no en el objeto que posee esta colección. Realizo actualizaciones utilizando operaciones en cascada.


¿Por qué perder tu tiempo de vida? Te sugiero que simplemente desechemos la entidad.

getEntityManager().detach(myEntity)

y busque la representación persistente de la base de datos y luego podrá decidir si los campos relevantes cambiaron, de modo que pueda crear una nueva versión. Al menos asegúrate de que este objeto esté sucio :)


El método onFlushDirty (...) funciona para que yo verifique la colección sucia. La entidad principal con la colección anidada se pasa a onFlushDirty, pero no sabía que la entidad pasada podría ser el elemento de la colección. Una vez que encontré eso, funcionó tanto para la colección anidada como para su entidad principal.

public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types)

Otro método, onCollectionUpdate (...), también se puede usar para detectar colecciones sucias, se llama después de onFlushDirty (...).


Es una excelente pregunta, esta es la respuesta corta: Hibernate-Session tiene un método isDirty ()

Respuesta larga con ejemplo (CASO DE PRUEBA 1):

Si está utilizando Seam / POJOs / JPA sobre Hibernate. le gustaría saber qué entidades están sucias antes de llamar a entityManager.flush (), es decir, saber para qué entidades Hibernate emitiría una declaración de actualización, y aplicar algunos cambios en estos registros (establezca algunos valores, como quién cambió el registro, etc.) .

Usted sabe que la sesión de hibernación tiene un método isDirty (), pero esto no es suficiente en algunos casos.

puede registrar un Hibernate-Interceptor en su archivo persistence.xml

<property name="hibernate.ejb.interceptor" value="path.to.MyInterceptor" />

e intercepte el método onFlushDirty (...) y guarde los objetos sucios en un mapa, pero ¿cómo puedo acceder a este mapa más adelante? No tengo acceso al interceptor en tiempo de ejecución (para poder llamar a interceptor.getDirtyEntities ()), tienes esto:

public class MyInterceptor extends EmptyInterceptor { private Map<IdentityKey,Object> dirtyEntitiesMap = new HashMap<IdentityKey,Object>(); @Override public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) { dirtyEntitiesMap.put(new IdentityKey(id, entity.getClass()), entity); return super.onFlushDirty(entity, id, currentState, previousState, propertyNames, types); } ... }

SOLICITE ESTE CASO DE PRUEBA: No necesita saber qué entidades cambian si solo necesita actualizarlas. Puede agregar su código (poblando al usuario que los cambió) en un método @PreUpdate. Las entidades que están sucias se modificarán en consecuencia, las que no lo estén, no recibirán este método, ya que no hay nada que actualizar (y Hibernate lo detectará). Puede hacer lo mismo para las nuevas entidades en un método @PrePersist que probablemente sea idéntico. Puedes anotar el mismo método con ambos.

Si también necesita registrar qué campos se han cambiado, sugeriría que mire primero a Envers.