2012-03-30 6 views
1

Derzeit verwende ich ein Transaction View-Muster, um das Lazy-Laden von Sammlungen in Ansichten zu ermöglichen.JPA Lazy Loading Sammlungen in JSF-Ansicht - besser als Filter verwenden?

Ich habe folgendes in web.xml

<filter> 
    <filter-name>view</filter-name> 
    <filter-class>com.jasoni.ViewFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>view</filter-name> 
    <url-pattern>*.xhtml</url-pattern> 
</filter-mapping> 

Und der Filterklasse hat die folgenden ...

public class ViewFilter implements Filter { 
    @Resource UserTransaction tx; 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    try { 
     tx.begin(); 
     chain.doFilter(request, response); 
    } 
    //catch here 
    finally { 
     //another try-catch 
     tx.commit(); 
    } 
    } 
} 

Dann vorausgesetzt, ich habe folgendes (eher gekünstelt) Backing Bean

@ManagedBean 
@RequestScoped 
public class DepartmentEmployees { 
    @EJB 
    private DepartmentServiceBean deptService; 
    @ManagedProperty(value="#{param.deptId}") 
    private Integer deptId; 
    private Department dept; 

    @PostConstruct 
    public String init() { 
    dept = deptService.findById(deptId); 
    } 
} 

Ich kann so etwas in meiner Ansicht (.xhtml Datei)

tun

Ich frage mich nur, ob jemand eine andere Möglichkeit kennt, dasselbe zu erreichen, ohne Filter (oder Servlets) zu benutzen.

Antwort

5

Dieser Ansatz ("offene Sitzung in Sicht") hat einige große Nachteile. Abgesehen davon, dass es eine Art Hacky ist (es ist sicherlich nicht die Design-Idee eines Servlet-Filters, um eine Geschäftssitzung zu steuern), gibt es nicht viele Optionen, um eine "echte" Ausnahme beim Rendern der JSF-Seite zu verarbeiten.

Sie schreiben nicht viel über Ihre Infrastruktur/Technologie-Stack, aber ich nehme an, dass Sie auf einem Java EE 6-Server sind.

Normalerweise verwende ich die EntityManger im erweiterten Modus und flush es mit Transaktionen, die ich explizit durch Anmerkungen nur bestimmte Methoden meiner Business-Fassade steuern. Werfen Sie einen Blick auf dieses Beispiel (aus Adam Bien - Real World Java EE Patterns, Rethinking Best Practices):

@Stateful 
@TransactionAttribute(TransactionAttributeType.NEVER) 
public class BookFacadeBean implements BookFacade { 
    @PersistenceContext(type=PersistenceContextType.EXTENDED) 
    private EntityManager em; 
    private Book currentBook; 

    public Book find(long id){ 
     this.currentBook = this.em.find(Book.class, id); 
     return this.currentBook; 
    } 
    public void create(Book book){ 
     this.em.persist(book); 
     this.currentBook = book; 
    } 
    public Book getCurrentBook() { 
     return currentBook; 
    } 
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void save(){ 
     //nothing to do here 
    } 
} 

Eine nächste Stufe in diesem Ansatz wäre es, die EntityManager mit einem CDI Gespräch Umfang zu binden. Einen Blick auf (a) Weld (b) Seam 3 Persistence für weitere Diskussionen zu diesem Thema.

Dies ist eher eine grobe Skizze einer Alternative als eine detaillierte Anleitung. Ich hoffe dieses Informationsniveau ist das, wonach Sie gefragt haben - zögern Sie nicht, weitere Fragen zu stellen. :-)

+0

Hallo Jan, danke für deine Antwort! Ja, ich benutze einen Java EE Server (JBoss) und möchte vermeiden, zu viele Dinge zu tun, die JBoss-spezifisch sind. Gibt es einen ähnlichen Ansatz, der mit Stateless Session Beans funktionieren wird? – JasonI

+0

Nun, nichts, was ich gepostet habe, ist JBoss-spezifisch, Sie werden keine Unze Portabilität verlieren (Weld ist die Standard-CDI-Implementierung und Seam 3 ist eine reguläre CDI-Erweiterung). Dieser Ansatz ist jedoch zustandsorientiert, sodass Sie ihn nicht mit SLSB implementieren können. Aber fürchtet euch nicht vor Staaten, da ist nichts schlechtes an ihnen. –

+0

Okay, danke für die Info. Ich werde anfangen, in Weld und Seam3 zu suchen. – JasonI