JPA lazy loading Sammlungen in JSF-Sicht - besseren Weg, als mit Filter?
Derzeit bin ich über eine Transaktion Muster Anzeigen, um lazy-loading von Sammlungen möglich in Aussicht.
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 die Filter-Klasse 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 die folgenden (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);
}
}
Kann ich tun so etwas wie dieses aus meiner Sicht (.xhtml-Datei)
<ul>
<c:forEach var="emp" items="#{departmentEmployees.dept.employees}">
<li>#{emp.firstName} #{emp.lastName}</li>
</c:forEach>
</ul>
Nur Fragen, ob jemand weiß, von einem anderen Weg zu erreichen, die gleiche Sache ohne die Verwendung von filtern (oder servlets).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Ansatz ("open session in view") hat ein paar große Nachteile. Abgesehen davon, dass Art von hacky (es ist sicherlich nicht der design-Idee von einer servlet-filter zur Steuerung einer business-Sitzung), die Sie nicht haben viele Optionen, um angemessen zu verarbeiten "echte" Ausnahme, die Auftritt, während rendering JSF-Seite.
Du nicht viel schreiben über Ihre Infrastruktur - /Technologie-stack, aber ich gehe davon aus, dass Sie auf einem Java-EE-6-server.
Normalerweise verwende ich die
EntityManger
im Erweiterten Modus und Spülen Sie es mit Transaktionen die ich Kontrolle ausdrücklich von Anmerkungen nur bestimmte Methoden aus meiner business-Fassade. Haben Sie einen Blick auf dieses Beispiel (aus Adam Bien - Real World Java EE Patterns Rethinking Best Practices):Eine nächste Stufe in diesem Ansatz wäre, zu binden, den EntityManager zu einer CDI conversation-scope. Haben Sie einen Blick auf (a) Schweißen (b) Naht 3 Ausdauer für weitere Diskussionen zu diesem Thema.
Dies ist eher eine grobe Skizze einer alternative als ein detailliertes how-to. Ich hoffe, dass diese Ebene der information ist das, was Sie gefragt wurden - fühlen Sie sich frei, zu Fragen, weitere Fragen. 🙂