Внедрение CDI в EntityListeners

Поскольку 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
}

Я хочу знать, есть ли у этого подхода какие-либо недостатки или моменты, на которые следует обратить внимание. Производительность? Что происходит, когда несколько вошедших в систему пользователей одновременно обновляют объекты в своих областях?
Hibernate JPA 2.0
Seam Weld CDI
Glassfish 3.1.2


person Uluk Biy    schedule 26.05.2012    source источник


Ответы (1)


Ваш подход правильный.

Производительность?

ИМХО беспокоиться не о чем - JPA 2.1 будет использовать аналогичный механизм. Но не забудьте написать реалистичный тест на всякий случай.

Что происходит, когда несколько вошедших в систему пользователей одновременно обновляют объекты в своих областях?

Все (не зависящие от области видимости) ссылки на bean-компоненты проксируются внутри. Нижележащая реализация CDI должна гарантировать правильное разрешение.

person jan groth    schedule 26.05.2012