2009-12-08 17 views
6

Estoy trabajando en una aplicación web JPA (implementación Hibernate), Spring and Stripes. Tengo varias entidades JPA que tienen los siguientes campos en común para fines de auditoría y consulta:Configuración de createdBy y updatedBy en entidades JPA automáticamente

createdBy: el ID de usuario de la persona que creó la entidad. CreatedOn - la fecha en que la entidad fue creada updatedBy - el ID de usuario de la persona que actualizó por última vez la entidad UpdatedOn - la fecha en que la entidad se actualizó por última

Tengo mi aplicación de trabajo para que CreatedOn y son UpdatedOn se establece automáticamente cuando se persiste la entidad, pero no estoy seguro de cómo puedo completar los campos createdBy y updatedBy sin tener que pasar la identificación del usuario actualmente conectado desde la clase de controlador a los DAO.

¿Alguien tiene alguna sugerencia sobre cómo podría hacer esto sin pasar los ID de usuario por todos lados? Tenga en cuenta que la ID de usuario actual se almacena en el objeto HttpSession en este momento, por lo que mi backend necesita acceder de alguna manera a estos datos ...

¡Gracias!

+0

¿No quieres establecer el createdBy y updatedBy en el controlador antes de persistir? – yihtserns

+0

¿Qué mecanismo usaste para comprobar si el objeto está sucio, por lo que configuras los campos 'updateBy/At'? Hice una pregunta relacionada, por favor verifíquela: http: // stackoverflow.com/questions/20620406/how-to-set-user-id-on-entity-update – WelcomeTo

Respuesta

1

He decidido que un ThreadLocal es probablemente la forma más limpia de hacer esto en mi aplicación.

3

Puede echar un vistazo a uno de estos enfoques para pasar el ID de usuario como contexto en la capa de negocio:

(Los mensajes todavía puede ser relevante incluso si no está utilizando EJB. La segunda publicación tiene sentido, sin embargo, solo si utiliza Spring con JTA)

Yo personalmente desaconsejo estos enfoque, tal como la concibo dos problema con él:

  • Comprobabilidad: necesitará datos contextuales que se creará en la prueba
  • Contrato: datos contextuales participan en el contrato de uso de la entidad, pero no es claramente visible en La interfaz.

Pasar ID de usuario "por todas partes" puede parecer un gran trabajo, pero creo que es más limpio.

Para establecer la fecha y el ID de usuario automáticamente cuando se crea o actualiza la entidad, puede usar un EntityListener or lifecycle callbacks (tal vez ya lo esté haciendo). creo que sirve ...

0

que crearía una clase como esta:


@MappedSuperclass 
public abstract class AuditableDomainClass { 
    private long createdBy; 
    private long updatedBy; 

    //getters and setters 

Sus clases de entidades que tengan el requisito de que has descrito simplemente extender esta clase, lo haces con las variables en la capa que necesita (controlador, por ejemplo) y no necesita preocuparse por ello en los DAO.

+0

Sí, ya tengo algo como esto - mi problema es que no quería pasar las variables desde la capa de controlador - pero parece que debería hacerlo. – JMM

Cuestiones relacionadas