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