2012-05-26 9 views
10

JPA 2.0은 EntityListener (JPA 2.1) 로의 주입을 지원하지 않으므로 JNDI 조회를 사용하여 BeanManager을 얻고이를 통해 로그인 한 사용자를 얻습니다. 나는이에 EntityListener 유사한 정의 : 어떤 단점이나 지점이 방법의주의가 지불하는 것입니다 알고 싶어EntityListeners에서 CDI 주입

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

:로

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

사용자가 세션 범위에서 관리됩니다. 성능 처리량? 엔티티를 자체 범위에서 동시에 업데이트하는 로그인 한 여러 사용자가있는 경우 어떻게됩니까?
최대 절전 모드 JPA 2.0
심 용접 CDI
글래스 피시 3.1.2

답변

4

귀하의 접근 방식은 올바른 것입니다.

성능 처리량은 무엇입니까?

IMHO 걱정할 필요가 없습니다. JPA 2.1은 동등한 메커니즘을 사용합니다. 그러나 안전한쪽에 있으려면 realistic test을 써야합니다.

복수의 로그인 한 사용자가 자신의 범위에서 동시에 개체를 업데이트하면 어떻게됩니까?

모든 비 종속 범위 참조는 내부적으로 프록시 처리됩니다. 언더 레이 CDI 구현은 올바른 해상도를 보장해야합니다.