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