UserTransaction - skąd wziąć implementację tego interfejsu

0

Wygenerowałem w Netbeans encje na podstawie konkretnej bazy danych oraz kontrolery encji. W tym poradniku każdy z kontrolerów pobiera w konstruktorze implementację interfejsu EntityManagerFactory i o ile wiem mniej więcej jak pobrać obiekt tego typu to w Netbeans 8.2 mam dodatkowo parametr UserTransaction i nie za bardzo rozumiem skąd mam to pobierać.

Przykładowy konstruktor w kontrolerze:

public CustomerJpaController(UserTransaction utx, EntityManagerFactory emf) {
        this.utx = utx; //skąd to wziąć?
        this.emf = emf;
    }

I przykładowa metoda w servlecie:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            /* TODO output your page here. You may use following sample code. */            
                        
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("sample.EclipseLink");
            
            CustomerJpaController customerJpaController = new CustomerJpaController(/* skad wziąć ten obiekt */, factory);
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }

Czy mógłby mi ktoś wyjaśnić jak tego prawidłowo używać i w jakim miejscu najlepiej tworzyć obiekty kontrolerów (serwlet czy może inny obiekt)

0

UserTransaction jest czescia JTA(tego od EJB), a EntityManagerFactory to czesc JPA.

ja bym sprobowal wstrzyknac, cos w stylu

@Resource
UserTransaction userTransaction;

0

Faktycznie, można wstrzyknąć za pomocą adnotacji tylko gdzie najlepiej to robić w serwlecie czy bezpośrednio w klasie kontrolera (i wywalić z konstruktora ten parametr)? Ogólnie przesiadam się na JEE z PHP więc jestem trochę zielony.. Nasuwa mi się jeszcze jedno pytanie czy da się oddelegować całość zarządzania tranzakcjami do serwera aplikacji? Jeśli tak jak to zrobić? Nie pobierać po prostu tranzakcji i nie wywoływać ręcznie metod begin itp. a całością zajmie się serwer czy jak?

1

Oczywiście, że można oddelegować całość zarządzania transakcjami do kontenera. Użycie UserTransaction jest opcjonalne :) Poczytaj o adnotacji @Transactional i tym jak należy jej używać w komponentach EJB i CDI. Rzuć też okiem na https://dzone.com/refcardz/java-enterprise-edition-7, bo to całkiem fajny skrót JEE7

1 użytkowników online, w tym zalogowanych: 0, gości: 1