Jestem zaznajomiony z pojęciem ORM, a kilka lat temu używałem nHibernate do projektu .NET; jednak nie nadążałem za tematem ORM w Javie i nie miałem okazji użyć żadnego z tych narzędzi.
Ale teraz być może będę miał szansę zacząć używać niektórych narzędzi ORM w jednej z naszych aplikacji, próbując odejść od szeregu starszych usług internetowych.
Trudno mi powiedzieć, jaka jest różnica między specyfikacją JPA, tym, co otrzymujesz z samą biblioteką Hibernate i co ma do zaoferowania JDO.
Rozumiem więc, że to pytanie jest nieco otwarte, ale liczyłem na kilka opinii na temat:
- Jakie są zalety i wady każdego z nich?
- Co byś zaproponował do nowego projektu?
- Czy istnieją pewne warunki, w których warto byłoby zastosować jedną strukturę w porównaniu z drugą?
Upewnij się, że oceniłeś implementację JDO DataNucleus. Zaczęliśmy od Hibernate, ponieważ wydawał się być tak popularny, ale dość szybko zdaliśmy sobie sprawę, że nie jest to w 100% przezroczyste rozwiązanie do trwałości. Jest zbyt wiele zastrzeżeń, a dokumentacja jest pełna „jeśli masz taką sytuację, musisz napisać swój kod w ten sposób”, co odebrało radość swobodnego modelowania i kodowania w dowolny sposób. JDO nigdy nie spowodowało, że dostosowałem mój kod lub model, aby „działał poprawnie”. Mogę po prostu zaprojektować i zakodować proste POJO, tak jakbym miał używać ich tylko „w pamięci”, ale mogę je utrwalać w sposób przejrzysty.
Inną zaletą JDO / DataNucleus w porównaniu z hibernacją jest to, że nie ma całego narzutu odbicia w czasie wykonywania i jest bardziej wydajna w pamięci, ponieważ wykorzystuje ulepszenie kodu bajtowego czasu kompilacji (może dodać 1 sekundę do czasu kompilacji dla dużego projektu). niż wzorzec proxy zasilany w czasie wykonywania przez hibernację.
Inną rzeczą, która może Cię denerwować w przypadku Hibernate, jest to, że odniesienie do tego, co myślisz, jest obiektem ... często jest to „proxy” dla obiektu. Bez korzyści w postaci ulepszenia kodu bajtowego wzorzec proxy jest wymagany, aby umożliwić ładowanie na żądanie (tj. Uniknąć ściągania całego grafu obiektowego podczas ściągania obiektu najwyższego poziomu). Przygotuj się na zastąpienie równości i hashcode, ponieważ obiekt, do którego myślisz, że się odwołujesz, jest często tylko serwerem proxy dla tego obiektu.
Oto przykład frustracji, które dostaniesz dzięki Hibernate, a których nie uzyskasz dzięki JDO:
http://blog.andrewbeacock.com/2008/08/how-to-implement-hibernate-safe-equals.html
http://burtbeckwith.com/blog/?p=53
Jeśli lubisz kodować w celu obejścia problemu, z pewnością Hibernate jest dla Ciebie. Jeśli cenisz czysty, czysty, zorientowany obiektowo, oparty na modelach programowanie, w którym cały swój czas spędzasz na modelowaniu, projektowaniu i kodowaniu, bez brzydkich obejść, poświęć kilka godzin na ocenę JDO / DataNucleus . Zainwestowane godziny zostaną zwrócone tysiąckrotnie.
Aktualizacja z lutego 2017 r
Od dłuższego czasu DataNucleus wdraża standard trwałości JPA oprócz standardu trwałości JDO, więc przenoszenie istniejących projektów JPA z Hibernate do DataNucleus powinno być bardzo proste, a wszystkie wyżej wymienione zalety DataNucleus można uzyskać przy niewielkiej zmianie kodu , Jeśli w ogóle. Więc jeśli chodzi o wybór konkretnego standardu, JPA (tylko RDBMS) vs JDO (RDBMS + No SQL + ODBMSes + inne), DataNucleus obsługuje oba, Hibernate jest ograniczone tylko do JPA.
Wydajność aktualizacji Hibernate DB
Kolejną kwestią, którą należy wziąć pod uwagę przy wyborze ORM, jest skuteczność jego brudnego mechanizmu sprawdzania - staje się to bardzo ważne, gdy trzeba skonstruować SQL, aby zaktualizować obiekty, które zmieniły się w bieżącej transakcji - zwłaszcza gdy jest dużo obiektów. W tej odpowiedzi SO jest szczegółowy opis techniczny brudnego mechanizmu sprawdzania Hibernate'a: JPA z wstawką HIBERNATE bardzo wolno
źródło
Niedawno oceniłem i wybrałem ramy trwałości dla projektu Java, a moje ustalenia są następujące:
Widzę, że wsparcie na rzecz JDO to przede wszystkim:
a poparcie na rzecz WZP to przede wszystkim:
Widzę wiele postów pro-JPA od programistów JPA, którzy wyraźnie nie używali JDO / Datanucleus, oferujących słabe argumenty za nieużywaniem JDO.
Widzę również wiele postów od użytkowników JDO, którzy przenieśli się do JDO i dzięki temu są o wiele szczęśliwsi.
Biorąc pod uwagę większą popularność JPA, wydaje się, że jest to częściowo spowodowane wsparciem dostawców RDBMS, a nie lepszym technicznie. (Dla mnie brzmi jak VHS / Betamax).
JDO i jego referencyjna implementacja Datanucleus najwyraźniej nie jest martwy, jak pokazuje przyjęcie go przez Google do GAE i aktywne tworzenie kodu źródłowego (http://sourceforge.net/projects/datanucleus/).
Widziałem wiele skarg dotyczących JDO z powodu ulepszenia kodu bajtowego, ale nie ma jeszcze wyjaśnienia, dlaczego jest źle.
W rzeczywistości w świecie, który ma coraz większą obsesję na punkcie rozwiązań NoSQL, JDO (i implementacja datanucleus) wydaje się znacznie bezpieczniejszym rozwiązaniem.
Właśnie zacząłem używać JDO / Datanucleus i skonfigurowałem go tak, aby móc łatwo przełączać się między użyciem db4o i mysql. Przy szybkim programowaniu pomocne jest użycie db4o i nie trzeba martwić się zbytnio o schemat bazy danych, a następnie, gdy schemat zostanie ustabilizowany, w celu wdrożenia w bazie danych. Jestem również pewien, że później będę mógł wdrożyć całą / część mojej aplikacji w GAE lub skorzystać z rozproszonej pamięci masowej / map-zredukuj a la hbase / hadoop / cassandra bez zbytniego refaktoryzacji.
Początkowa przeszkoda związana z rozpoczęciem pracy z Datanucleus była trochę skomplikowana - Dokumentacja na stronie internetowej Datanucleus jest trochę trudna do zrozumienia - samouczki nie są tak łatwe do wykonania, jak bym chciał. Powiedziawszy to, bardziej szczegółowa dokumentacja dotycząca API i mapowania jest bardzo dobra, gdy przejdziesz przez początkową krzywą uczenia się.
Odpowiedź brzmi: to zależy od tego, czego chcesz. Wolałbym mieć bardziej przejrzysty kod, brak dostępu do dostawcy, bardziej zorientowane na pojo, opcje nosql a bardziej popularne.
Jeśli chcesz mieć ciepłe, wybredne wrażenie, że robisz to samo, co większość innych programistów / owiec, wybierz JPA / hibernacja. Jeśli chcesz być liderem w swojej dziedzinie, wypróbuj JDO / Datanucleus i podejmij decyzję.
źródło
Nie sugerowałbym też! Zastosowanie Wiosna DAO jest
JdbcTemplate
razem zStoredProcedure
,RowMapper
aRowCallbackHandler
zamiast tego.Moje osobiste doświadczenie z Hibernate jest takie, że czas zaoszczędzony z góry jest więcej niż rekompensowany przez niekończące się dni, które spędzisz w trakcie próbowania zrozumienia i debugowania problemów, takich jak nieoczekiwane kaskadowe zachowanie aktualizacji.
Jeśli korzystasz z relacyjnej bazy danych, to im bliżej jej jest Twój kod, tym większą masz kontrolę. Warstwa DAO Springa umożliwia precyzyjną kontrolę warstwy mapowania, jednocześnie eliminując potrzebę stosowania standardowego kodu. Ponadto integruje się z warstwą transakcyjną Springa, co oznacza, że możesz bardzo łatwo dodawać (przez AOP) skomplikowane zachowania transakcyjne bez ingerencji w kod (oczywiście, otrzymujesz to również z Hibernate).
źródło
JDO właściwie nie umarło, więc proszę sprawdzić fakty. JDO 2.2 zostało wydane w październiku 2008 JDO 2.3 jest w fazie rozwoju.
Jest to otwarcie rozwijane pod Apache. Więcej wydań niż miał JPA, a jego specyfikacja ORM wciąż wyprzedza proponowane funkcje JPA2
źródło
JDO ma zaawansowane funkcje niż JPA, patrz http://db.apache.org/jdo/jdo_v_jpa.html
źródło
Używam JPA (implementacja OpenJPA z Apache, która jest oparta na bazie kodu KODO JDO, która ma ponad 5 lat i jest wyjątkowo szybka / niezawodna). IMHO każdy, kto każe ci ominąć specyfikacje, daje ci złą radę. Poświęciłem czas i zdecydowanie zostałem nagrodzony. Za pomocą JDO lub JPA możesz zmieniać dostawców przy minimalnych zmianach (JPA ma mapowanie ORM, więc mówimy mniej niż jeden dzień, aby ewentualnie zmienić dostawców). Jeśli masz ponad 100 stołów, tak jak ja, to jest ogromne. Dodatkowo otrzymujesz wbudowane buforowanie z eksmisjami z pamięci podręcznej klastra i wszystko jest w porządku. SQL / Jdbc nadaje się do zapytań o wysokiej wydajności, ale przezroczysta trwałość jest znacznie lepsza w przypadku pisania algorytmów i procedur wprowadzania danych. Mam tylko około 16 zapytań SQL w całym systemie (ponad 50 tysięcy wierszy kodu).
źródło
Sam się tym przyglądałem i nie mogę znaleźć między nimi dużej różnicy. Myślę, że duży wybór polega na tym, w której implementacji używasz. Sam rozważałem platformę DataNucleus , ponieważ jest to niezależna od magazynu danych implementacja obu.
źródło
Każdy, kto mówi, że JDO nie żyje, jest astroturfingowym handlarzem FUD i oni o tym wiedzą.
JDO żyje i ma się dobrze. Specyfikacja jest wciąż mocniejsza, dojrzała i bardziej zaawansowana niż znacznie młodszy i ograniczony JPA.
Jeśli chcesz ograniczyć się tylko do tego, co jest dostępne w standardzie JPA, możesz pisać do JPA i używać DataNucleus jako wydajnej, bardziej przejrzystej implementacji trwałości niż inne implementacje JPA. Oczywiście DataNucleus implementuje również standard JDO, jeśli chcesz elastyczności i wydajności modelowania, które zapewnia JDO.
źródło
Użyłem Hibernate (implementacja JPA) i JPOX (implementacja JDO) w tym samym projekcie. JPOX działał dobrze, ale dość szybko napotkał błędy, gdzie niektóre funkcje języka Java 5 nie były obsługiwane w tym czasie. Miał problemy z dobrą zabawą z transakcjami XA. Generowałem schemat bazy danych z obiektów JDO. Chciała łączyć się z bazą danych za każdym razem, co jest denerwujące, jeśli połączenie z Oracle nie działa.
Następnie przeszliśmy na Hibernację. Przez chwilę bawiliśmy się po prostu używając czystego JPA, ale musieliśmy użyć niektórych funkcji specyficznych dla Hibernacji, aby wykonać mapowanie. Uruchamianie tego samego kodu w wielu bazach danych jest bardzo łatwe. Hibernacja wydaje się agresywnie buforować obiekty lub czasami zachowuje się dziwnie. Istnieje kilka konstrukcji DDL, których Hibernate nie obsługuje, dlatego są one zdefiniowane w dodatkowym pliku, który jest uruchamiany w celu zainicjowania bazy danych. Kiedy napotykam problem z Hibernacją, często wiele osób napotyka ten sam problem, co ułatwia wyszukiwanie rozwiązań w Google. Wreszcie, Hibernate wydaje się być dobrze zaprojektowane i niezawodne.
Niektórzy inni respondenci sugerowali użycie języka SQL. Prawdziwym zabójczym przypadkiem użycia mapowania relacyjno-obiektowego jest testowanie i rozwój. Bazy danych zbudowane do obsługi dużych ilości danych są zazwyczaj drogie i / lub trudne do zainstalowania. Trudno z nimi przetestować. Istnieje wiele baz danych Java w pamięci, których można używać do testowania, ale zazwyczaj są one bezużyteczne w środowisku produkcyjnym. Możliwość korzystania z prawdziwej, ale ograniczonej bazy danych zwiększy produktywność programowania i niezawodność kodu.
źródło
Zrobiłem przykładową aplikację internetową w maju 2012, która korzysta z JDO 3.0 i DataNucleus 3.0 - zobacz, jaka jest czysta: https://github.com/TorbenVesterager/BadAssWebApp
No dobra, może to trochę za czyste, ponieważ używam POJO zarówno dla bazy danych, jak i klienta JSON, ale jest fajnie :)
PS: zawiera kilka adnotacji SuppressWarnings (opracowanych w IntelliJ 11)
źródło