Domanda

Sto lavorando su un (implementazione Hibernate di) JPA, Primavera e Strisce web app. Ho un certo numero di entità JPA che hanno i seguenti campi in comune sia per scopi di audit e di query:

CreatedBy - l'ID utente della persona che ha creato l'entità. createdOn - data l'entità è stato creato UpdatedBy - l'ID utente della persona che ha aggiornato l'ultima volta l'entità updatedOn - data l'entità dell'ultimo aggiornamento

Ho il mio app di lavoro in modo che createdOn e updatedOn vengono impostati automaticamente quando l'entità viene mantenuto, ma non sono sicuro di come posso ottenere i campi CreatedBy e UpdatedBy popolate, senza dover passare attraverso attualmente connesso ID dell'utente tutta la strada dalla classe controller per i DAO.

Qualcuno ha qualche suggerimento su come potrei fare questo senza passare userids tutto il luogo? Si noti che l'ID utente corrente viene memorizzato nell'oggetto HttpSession in questo momento, quindi il mio backend ha bisogno di accedere in qualche modo questi dati ...

Grazie!

È stato utile?

Soluzione 2

Ho deciso che un ThreadLocal è probabilmente il modo più pulito per fare questo nella mia applicazione.

Altri suggerimenti

Si può avere uno sguardo a uno di questi approcci per passare l'ID utente come contesto nel livello di business:

(I messaggi possono ancora essere rilevanti anche se non si sta utilizzando EJB. Il secondo post ha senso tuttavia solo se si utilizza primavera con JTA)

Io personalmente sconsiglio questi approccio, come io percepisco due problema con esso:

  • testability: contestuale dati dovranno essere impostato nel test
  • Contratto: dati contestuali partecipano nel contratto di utilizzare l'entità, ma non è chiaramente visibile nell'interfaccia.

Passando UserID "dappertutto" può sembrare un grande lavoro, ma penso che sia più pulito.

Per impostare automaticamente la data e l'ID utente quando si crea un'entità o l'aggiornamento, è possibile utilizzare un EntityListener o del ciclo di vita callback (forse si sta già facendo). Speranza che aiuta ...

Mi piacerebbe creare una classe in questo modo:


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

  //getters and setters

I tuoi classi di entità che hanno il requisito che hai descritto sarebbe semplicemente estendere questa classe, quando si imposta si variabili nello strato è necessario (regolatore per esempio) e non c'è bisogno di preoccuparsi per tutta la strada giù nelle DAO.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top