2012-05-26 6 views
10

JPA 2.0はEntityListener(JPA 2.1)への注入をサポートしていないため、JNDIルックアップを使用してBeanManagerを取得し、ログインしたユーザーを取得することにしました。私はこれに似たEntityListener定義:としてEntityListenersでのCDI注入

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と書いてください。

複数のログインしているユーザーがエンティティ を独自のスコープで同時に更新するとどうなりますか?

すべての(非依存スコープの)ビーン参照は、内部的にプロキシされます。下層のCDI実装は正しい解像度を保証する必要があります。

関連する問題