由于JPA2.0不支持注入到EntityListener中(JPA2.1将支持),因此决定使用JNDI lookup来获取BeanManager,并通过它获取登录用户。我定义了一个类似如下的EntityListener:
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());
}
}用户在会话作用域中的管理方式为:
@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
}我想知道这种方法有什么缺点或需要注意的地方。性能吞吐量?当有多个登录用户在自己的作用域中并发更新实体时,会发生什么情况?
Hibernate JPA 2.0
缝焊CDI
Glassfish 3.1.2
发布于 2012-05-26 20:53:55
你的方法是正确的。
性能吞吐量?
我不需要担心- JPA 2.1将使用相同的机制。但为了安全起见,请确保编写一个realistic test。
当有多个登录用户同时更新自己作用域中的实体时,会发生什么情况?
所有(非依赖作用域的) bean引用都在内部代理。底层的CDI实现必须保证正确的解决方案。
https://stackoverflow.com/questions/10765508
复制相似问题