2012-05-26 11 views
10

Poiché JPA 2.0 non supporta l'iniezione in EntityListener (JPA 2.1), ha deciso di utilizzare la ricerca JNDI per ottenere il BeanManager e tramite esso ottenere l'utente connesso. Ho definito un EntityListener simile a questo:Iniezione CDI in EntityListeners

public class MyEntityListener { 

    public static BeanManager getBeanManager() { 
     try { 
      InitialContext initialContext = new InitialContext(); 
      return (BeanManager) initialContext.lookup("java:comp/BeanManager"); 
     } catch (NamingException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    public Object getBeanByName(String name) { 
     BeanManager bm = getBeanManager(); 
     Bean bean = bm.getBeans(name).iterator().next(); 
     CreationalContext ctx = bm.createCreationalContext(bean); 
     return bm.getReference(bean, bean.getClass(), ctx); 
    } 

    @PrePersist 
    @PreUpdate 
    public void onPreInsertOrUpdate(MyEntity entity) { 
     User loggedInUser = (User) getBeanByName("loggedInUser"); 
     entity.setUpdatedUser(loggedInUser); 
     entity.setUpdatedTimestamp(new Date()); 
    } 
} 

utente viene gestito nell'ambito di sessione come:

@SessionScoped 
public class UserManager implements Serializable { 

    private User loggedInUser; 

    @Produces 
    @Named("loggedInUser") 
    public User getLoggedInUser() { 
     return loggedInUser; 
    } 

    // Set the logged in user after successfully login action 
} 

Voglio sapere c'è qualche svantaggi o punti di prestare attenzione di questo approccio. Rendimento? Cosa succede quando ci sono più utenti registrati che aggiornano le entità contemporaneamente nei propri ambiti?
Hibernate JPA 2.0
cordone di saldatura CDI
Glassfish 3.1.2

risposta

4

Il tuo approccio è corretto.

Prestazioni?

IMHO non c'è motivo di preoccuparsi: JPA 2.1 utilizzerà un meccanismo equivalente. Ma assicurati di scrivere un realistic test per essere al sicuro.

Cosa succede quando più utenti che hanno effettuato l'accesso aggiornano le entità contemporaneamente nei rispettivi ambiti?

Tutti i riferimenti a bean (non relativi allo scopo) vengono inoltrati internamente. L'implementazione del CDI sottostante deve garantire la risoluzione corretta.