2012-05-26 4 views
10

Поскольку JPA 2.0 не поддерживает инъекцию в EntityListener (JPA 2.1), решил использовать поиск JNDI для получения BeanManager и через него получить зарегистрированного пользователя. Я определил EntityListener похожее на это:CDI-инъекция в EntityListeners

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

ответ

4

Ваш подход является правильным.

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

IMHO не нужно беспокоиться - JPA 2.1 будет использовать эквивалентный механизм. Но обязательно напишите realistic test, чтобы быть в безопасности.

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

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