由于JPA 2.0不支持注入EntityListener(将使用JPA 2.1),因此决定使用JNDI查找来获取,BeanManager并通过它来获取登录用户。我定义了一个EntityListener与此类似的东西:
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
您的方法是正确的。
性能吞吐量?
恕我直言,无需担心-JPA 2.1将使用等效的机制。但是请确保编写一个切实可行的测试,以确保安全。
当有多个登录用户在其自己的范围内同时更新实体时,会发生什么情况?
所有(非依赖范围的)bean引用都在内部进行代理。底层的CDI实现必须保证正确的分辨率。