EntityManager ThreadLocal-pattern mit JPA in JSE

Entwickle ich ein einfaches "Book Store" - Projekt mit Struts 1.3 + JPA (mit Hibernate als Persistenz-provider). Ich kann nicht wechseln, um den Frühling oder andere anspruchsvollere Entwicklungsumgebung (z.B. Jboss) und ich kann keine Hibernate-spezifische Technik (z.B. Session Klasse).

Angesichts der Tatsache, dass ich in einer JSE Umgebung, muss ich ausdrücklich die Verwaltung des gesamten EntityManager-Lebenszyklus.

Den Book entity wird wie folgt definiert:

@Entity
public class Book {

@Id private String isbn;
private String title;
private Date publishDate;

    //Getters and Setters
}

Definierte ich drei Action Klassen, die verantwortlich sind, beziehungsweise abrufen alle Buch-Instanzen, abrufen eines Einzel-book-Instanz, indem Sie seine ISBN, und Zusammenführen ein freistehendes Buch in die DB.

Zur Steigerung der Trennung zwischen business-Logik-code und code für den Datenzugriff, ich stellte eine einfache BookDAO - Objekt, das laden der Ausführung von CRUD-Operationen. Im Idealfall sind alle Daten-access-bezogene Aufrufe delegiert werden sollte, um den persistence layer. Zum Beispiel, die ListBookAction ist wie folgt definiert:

public class ListBookAction extends Action {

    private BookDAO dao = new BookDAO();

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        //Retrieve all the books
        List<Book> books = dao.findAll();

        //Save the result set
        request.setAttribute("books", books);

        //Forward to the view
        return mapping.findForward("booklist");
    }

}

Den BookDAO-Objekt für den Zugriff auf eine EntityManager Instanz, um eine operation. Da EntityManger ist nicht thread-safe ist, stellte ich eine helper-Klasse namens BookUnitSession die kapselt EntityManager innerhalb eines ThreadLocal variable:

public class BookUnitSession {

    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("BookStoreUnit");
    private static final ThreadLocal<EntityManager> tl = new ThreadLocal<EntityManager>();

    public static EntityManager getEntityManager() {
        EntityManager em = tl.get();

        if (em == null) {
            em = emf.createEntityManager();
            tl.set(em);
        }
        return em;
    }

}

Alles scheint zu funktionieren, ich habe aber noch einige Bedenken. Nämlich:

  1. Ist diese Lösung das beste, was zu tun ist? was ist die beste Vorgehensweise in diesem Fall?
  2. Ich muss noch ausdrücklich vorgesehen und schließen Sie den EntityManager und die EntityManagerFactory. Wie kann ich das tun?

Dank

InformationsquelleAutor Ilio Catallo | 2013-02-25
Schreibe einen Kommentar