2012-05-26 14 views
10

Dado que JPA 2.0 no es compatible con la inyección en EntityListener (JPA 2.1 lo hará), se decidió utilizar la búsqueda JNDI para obtener el BeanManager y obtener el usuario conectado. He definido un EntityListener similar a esto:Inyección de CDI en 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()); 
    } 
} 

usuario se gestiona en el ámbito de sesión como:

@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 
} 

Quiero saber ¿hay alguna desventajas o puntos para pagar la atención de este enfoque. Rendimiento de rendimiento? ¿Qué sucede cuando hay múltiples usuarios conectados que actualizan entidades al mismo tiempo en sus propios ámbitos?
Hibernate JPA 2.0
cordón de soldadura CDI
Glassfish 3.1.2

Respuesta

4

Su enfoque es correcto.

Rendimiento de rendimiento?

EN MIÓ N ° 1, sin necesidad de preocuparse - JPA 2.1 utilizará un mecanismo equivalente. Pero asegúrese de escribir un realistic test para estar en el lado seguro.

¿Qué sucede cuando hay múltiples usuarios conectados actualizando entidades al mismo tiempo en sus propios ámbitos?

Todas las referencias de bean (de ámbito no dependiente) están representadas internamente. La implementación subyacente de CDI debe garantizar la resolución correcta.

Cuestiones relacionadas