Pergunta

Eu estou trabalhando em um (implementação Hibernate de) JPA, Spring and Stripes aplicativo web. Eu tenho um número de entidades JPA que têm os seguintes campos em comum para ambos os fins de auditoria e de consulta:

CreatedBy - o ID de usuário da pessoa que criou a entidade. createdOn - a data em que a entidade foi criada updatedBy - o ID de usuário da pessoa que última actualização a entidade updatedOn - a data em que a entidade foi última actualização

Eu tenho meu aplicativo trabalhando para que createdOn e updatedOn são definidas automaticamente quando a entidade é persistente, mas não tenho certeza de como posso obter o CreatedBy e updatedBy campos preenchidos sem ter que passar pelo logado no ID do usuário todo o caminho da classe controlador para os DAOs.

Alguém tem alguma sugestão sobre como eu poderia fazer isso sem passar IDs todo o lugar? Note-se que o ID do usuário atual é armazenada no objeto HttpSession no momento, por isso as minhas necessidades de back-end para acessar alguma forma esses dados ...

Obrigado!

Foi útil?

Solução 2

Eu decidi que um ThreadLocal é provavelmente a forma mais limpa de fazer isso em meu aplicativo.

Outras dicas

Você pode ter um olhar para uma dessas abordagens para passar o ID de usuário como contexto na camada de negócios:

(As mensagens ainda podem ser relevantes mesmo se você não estiver usando EJB. O segundo post faz sentido no entanto, apenas se você usar o Spring com JTA)

Eu pessoalmente desencorajar estes abordagem, como eu percebo dois problemas com isso:

  • Testability: dados contextuais terá de ser configurado no teste
  • Contrato: dados contextuais participar no contrato para usar a entidade, mas não é claramente visível na interface.

Passando userID "todo o lugar" pode parecer um grande trabalho, mas eu acho que é mais limpo.

Para definir a data e identificação de usuário automaticamente quando entidade é criada ou atualização, você pode usar um EntityListener ou ciclo de vida callbacks (talvez você já está fazendo isso). Espero que ajude ...

eu criar uma classe como este:


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

  //getters and setters

As suas classes de entidade que têm a exigência de que você descreveu seria simplesmente estender esta classe, que seria fixado de variáveis ??na camada que você precisa (controlador por exemplo) e você não precisa se preocupar com isso todo o caminho para baixo nos DAOs.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top