EntityListeners中的CDI注入

Ulu*_*Biy 10 hibernate cdi java-ee-6 jpa-2.0 jboss-weld

由于JPA 2.0不支持注入EntityListener(JPA 2.1将),因此决定使用JNDI查找来获取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());
    }
}
Run Code Online (Sandbox Code Playgroud)

用户在会话范围内管理为:

@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
}
Run Code Online (Sandbox Code Playgroud)

我想知道这种方法有什么缺点或要点.性能吞吐量?当有多个登录用户在他们自己的范围内同时更新实体时会发生什么?
Hibernate JPA 2.0
Seam焊接CDI
Glassfish 3.1.2

jan*_*oth 4

你的做法是正确的。

性能吞吐量?

恕我直言,无需担心 - JPA 2.1 将使用等效机制。但为了安全起见,请确保编写一个现实的测试。

当多个登录用户在自己的范围内同时更新实体时会发生什么?

所有(非依赖范围)bean 引用都在内部进行代理。底层 CDI 实现必须保证正确的解析。