首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EntityListeners中的CDI注入

EntityListeners中的CDI注入
EN

Stack Overflow用户
提问于 2012-05-26 18:37:01
回答 1查看 6.9K关注 0票数 10

由于JPA2.0不支持注入到EntityListener中(JPA2.1将支持),因此决定使用JNDI lookup来获取BeanManager,并通过它获取登录用户。我定义了一个类似如下的EntityListener

代码语言:javascript
复制
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());
    }
}

用户在会话作用域中的管理方式为:

代码语言:javascript
复制
@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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-26 20:53:55

你的方法是正确的。

性能吞吐量?

我不需要担心- JPA 2.1将使用相同的机制。但为了安全起见,请确保编写一个realistic test

当有多个登录用户同时更新自己作用域中的实体时,会发生什么情况?

所有(非依赖作用域的) bean引用都在内部代理。底层的CDI实现必须保证正确的解决方案。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10765508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档