【问题标题】:CDI injection in EntityListenersEntityListeners 中的 CDI 注入
【发布时间】:2012-05-26 10:37:01
【问题描述】:

由于 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());
    }
}

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

@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
}

我想知道这种方法有什么缺点或需要注意的地方。性能吞吐量?当多个登录用户同时更新各自范围内的实体时会发生什么?
休眠 JPA 2.0
缝焊 CDI
Glassfish 3.1.2

【问题讨论】:

    标签: hibernate jpa-2.0 java-ee-6 cdi jboss-weld


    【解决方案1】:

    你的方法是正确的。

    性能吞吐量?

    恕我直言,无需担心 - JPA 2.1 将使用等效机制。但为了安全起见,请务必写realistic test

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

    所有(非依赖范围的)bean 引用都是在内部代理的。底层 CDI 实现必须保证正确的分辨率。

    【讨论】:

      猜你喜欢
      • 2018-05-15
      • 2014-04-05
      • 2011-11-15
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2017-10-25
      相关资源
      最近更新 更多