2012-05-26 8 views
10

Da JPA 2.0 die Injektion in EntityListener nicht unterstützt (JPA 2.1 wird), entschied man sich, JNDI-Lookup zu verwenden, um die BeanManager zu erhalten und dadurch den angemeldeten Benutzer zu erhalten. Ich definiert eine EntityListener ähnlich wie diese:CDI-Injektion in 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()); 
    } 
} 

Benutzer in Sitzungsbereich verwaltet wird, wie:

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

ich wissen will, ist es keine Nachteile oder Punkte Aufmerksamkeit dieses Ansatzes zu zahlen. Leistungsdurchsatz? Was passiert, wenn mehrere angemeldete Benutzer Entitäten gleichzeitig in ihren eigenen Bereichen aktualisieren?
Hibernate JPA 2.0
Seam Weld CDI
3.1.2

Glassfish

Antwort

4

Ihr Ansatz ist richtig.

Leistungsdurchsatz?

IMHO keine Sorge - JPA 2.1 wird einen äquivalenten Mechanismus verwenden. Stellen Sie jedoch sicher, dass Sie eine realistic test schreiben, um auf der sicheren Seite zu sein.

Was passiert, wenn mehrere angemeldete Benutzer Entitäten gleichzeitig in ihren eigenen Bereichen aktualisieren?

Alle Bean-Referenzen (nicht abhängig) werden intern angegeben. Die zugrundeliegende CDI-Implementierung muss die korrekte Auflösung garantieren.