Tworzenie repository bez springa - hibernate session factory vs JPA entity manager

0

Hej wszystkim,

Niestety nie potrafię znaleźć odpowiedzi na to pytanie, a chciałbym to zrobić dobrze.
Tworzę apkę wykorzystującą hibernate do komunikacji z bazą.
Zrobiłem dwie wersje : pierwsza korzysta z czystego hibernate -> stworzyłem sobie repository, gdzie tworzę nową sesję, sessionfactory.
Druga korzysta z EnetityManagera.
Osobiście bardziej mi się podoba korzystanie z EntityManagera, jest czytelniejsze, klasa ma mniej kodu i metod. Moje repo wyglądało by mniej więcej tak:

EntityManagerFactory factory = Persistence.createEntityManagerFactory("stationsApp");
        EntityManager entityManager = factory.createEntityManager();
        entityManager.getTransaction().begin();
        entityManager.persist(jakisObiekt);
        entityManager.getTransaction().commit();
        entityManager.close();
        factory.close();

stworzyłbym kolejnych kilka metod do fetchowania danych, update itd.
Czy są jakieś znaczące różnice/best practices które powinny skłonić mnie do pozostania z hibernetową sessionfactory?

1

Jak Ci wystarcza to możesz korzystać z EntityManager. HibernateSession ma wiecej metod - jak będziesz potrzebował to sobie dorobisz.
Pamiętaj, żeby nie powtarzać otwierania/ zamykania transakcji w każdej metodzie tylko wydzielić ten kod.

0
jarekr000000 napisał(a):

Jak Ci wystarcza to możesz korzystać z EntityManager. HibernateSession ma wiecej metod - jak będziesz potrzebował to sobie dorobisz.
Pamiętaj, żeby nie powtarzać otwierania/ zamykania transakcji w każdej metodzie tylko wydzielić ten kod.

Ok, dzięki za wyjaśnienie! Chodzi Ci o wydzielenie ze względów wizualnych czy wydajnościowych? Nie wiem czy wydzielić te części czy nie lepiej zrobić metody do otwierania i zamykania transakcji i w miejscach gdzie korzystam z repo będę musiał otworzyć najpierw transakcję:
repo.start()
operacje...
repo.stop().

PS. Po miniaturce wnioskuję że to Ty prezentowałeś na ubiegłorocznym jdd na temat adnotacji (pamiętam, ze mówiłeś że masz tu konto). Gratki, jedna z lepszych prezentacji moim zdaniem!

1

Co do JDD to ja.
Co do wydzielenia to nie tak. Chodzi o to, żeby nie powtarzać kodu i unikać błędów typu: zapomniałem o transakcji zamknięciu (oj -oj- oj).

Potrzebna CI bedzie funkcja tego typu:

public static <T> T doInTx( Function<EntityManager,T> code ) {
 try { 
   transaction.begin();
   code.apply(em);
   transaction.commit();
} 
catch (Exception e) {
   transaction.rollback();
   throw new RuntimeException(e);
}

}

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