spring repository vs entity manager

0

Jakie są roznice w używaniu entity managera lub spring data repository do zapisu/usuwania bazy danych itp?
Spokojnie to moze razem dzialac, ale wlasciwie kiedy lepiej uzywac jednego albo drugiego?
np. do usuwania widzialem częsciej repository.delete niz entitymanager.remove. A do zapisu czy updatu persist i merge...

I jeszcze do całości dochodzi springowe @Transactional.

Ktoś mi rozjaśni w głowie? Z góry dzięki.

0

W projekcie powinieneś zdecydować się na jedną z opcji - spring repository lub entity manager i trzymać się tego wyboru.
Nie powinieneś stosować ich naprzemiennie.

Ze swojej strony polecam spring repository.

@Transactional - zapewnia transakcje, gdy potrzebujesz transakcji, a nie stosujesz ejb. Transakcja będzie działać niezależnie, czy pod spodem jest spring repository, czy entity manager.

0

Dzieki. A czy spring repository pod spodem też uruchamia entity managera (aplikacja spring boot i hibernate sobie lata tez pod spodem)?

W jednym projekcie mam użyte to naprzemiennie. Czyli rozumiem, że moga uruchamiac sie kilka transakcji jedna po drugiej i cos moze sie dziac poza transakcją tej pierwszej? Taki przykład...

W niektórych testach też widziałem @Transactional co wydaje się w ogóle kiepskie bo trudno określić ile tych transakcji się uruchamia.

Jeszcze teraz dotyczałem, że jest:
EntityManager z @PersistanceContext
JpaTransactionManager
HibernateTransactionManager
Ale pierwszy znacznie sie rozni od pozostalych

0

@__krzysiek85, nie zgodzę się ze stwierdzeniem

Nie powinieneś stosować ich naprzemiennie.

Dużo zależy od tego co chcesz osiągnąć. Obecnie w projekcie mamy tak, że repository używamy do operacji CRUD, ale mamy też EM, który służy do zarządzania raportami.

0
Koziołek napisał(a):

Obecnie w projekcie mamy tak, że repository używamy do operacji CRUD, ale mamy też EM, który służy do zarządzania raportami.

To ze tak macie nie znaczy ze tak jest dobrze i porzadnie. Nie wytlumaczyles dlaczego tak macie, a to jest wazne. Bez tego wydam opinie jednoznaczna, nie pozwalajaca na dyskusje, w Twoim stylu: macie zle.

2

Rozdzielenie jest z oczywistej przyczyny. Repozytoria nie pozwalają na budowanie skomplikowanych zapytań w prosty sposób. Używanie metod o nazwach długich na 500 znaków nie jest proste.

1

U nas podobnie przy czym korzystam z custom repo (http://docs.spring.io/spring-data/data-commons/docs/current/reference/html/#repositories.custom-implementations) aby dodać jakieś skomplikowane zapytania i tam wtedy normalnie z EM

0

"Ze swojej strony polecam spring repository."

a mogę prosić o uzasadnienie?

0

czy grzecznie moge prosic o proszenie by ktos poprosił kogoś by ktos uzasadnil?

2

Uzasadnienie dla repository. Ponieważ wystarczy napisać:

public interface MyBeanRepository extends JpaRepository<MyBean, Long>{}

I masz ogarnięte jakieś 100% podstawowych operacji CRUD. Jeżeli chcesz konstruować pewne często używane zapytania to:

public interface MyBeanRepository extends JpaRepository<MyBean, Long>{

    Collection<MyBean> findByProperty(MyProperty value);

    Collection<MyBean> findByPropertyId(Long valueId);

}

inaczej mówiąc Spring potrafi na podstawie nazwy metody, która musi trzymać konwencję nazewniczą, rozwinąć sobie całkiem zgrabne zapytanie.

Niestety nie za bardzo będzie radzić sobie z na przykład odpytywaniem widoków, które są prostymi POJO, a my wiemy, że konkretne kolumny mapują się na kolumny w tabelach.

W takim wypadku sprawdza się EM jako sposób dostępu, bo (przynajmniej dla mnie) tworzenie zapytań z jego pomocą jest łatwiejsze w testowaniu. Oczywiście repository pozwala na definiowanie metod z adnotacją Query, które pod spodem odpalają zapytanie z adnotacji. IMO przy większych zapytaniach jest to jednak trochę bardziej upierdliwe i potrafi nieźle zaciemnić samo zapytanie (łączenie łańcuchów w ramach zapytania fuj).

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