To dość otwarte pytanie. Rozpocznę nowy projekt i przyjrzę się różnym ORM do zintegrowania z dostępem do bazy danych.
Czy masz jakieś ulubione? Czy są jakieś zalecenia dotyczące trzymania się z daleka?
To dość otwarte pytanie. Rozpocznę nowy projekt i przyjrzę się różnym ORM do zintegrowania z dostępem do bazy danych.
Czy masz jakieś ulubione? Czy są jakieś zalecenia dotyczące trzymania się z daleka?
Odpowiedzi:
Przestałem używać ORM.
Powodem tego nie jest żadna wielka wada koncepcji. Hibernacja działa dobrze. Zamiast tego odkryłem, że zapytania mają niewielki narzut i mogę dopasować wiele skomplikowanej logiki do dużych zapytań SQL i przenieść dużą część mojego przetwarzania do bazy danych.
Rozważ więc użycie pakietu JDBC.
Brak, ponieważ posiadanie ORM zabiera zbyt dużą kontrolę przy niewielkich korzyściach. Oszczędności czasu można łatwo zignorować, gdy trzeba debugować nieprawidłowości wynikające z użycia ORM. Ponadto ORM zniechęcają programistów do uczenia się SQL i tego, jak działają relacyjne bazy danych, i korzystania z nich na ich korzyść.
Wiele ORM jest świetnych, musisz wiedzieć, dlaczego chcesz dodać abstrakcję na JDBC. Mogę ci polecić http://www.jooq.org (zastrzeżenie: jestem twórcą jOOQ, więc ta odpowiedź jest stronnicza). jOOQ obejmuje następujący paradygmat:
Istnieje wiele innych dobrych ORM. Zwłaszcza Hibernacja lub iBATIS mają świetną społeczność. Ale jeśli szukasz intuicyjnego, prostego, powiem, wypróbuj jOOQ. Pokochasz to! :-)
Sprawdź ten przykładowy SQL:
// Select authors with books that are sold out
SELECT *
FROM T_AUTHOR a
WHERE EXISTS (SELECT 1
FROM T_BOOK
WHERE T_BOOK.STATUS = 'SOLD OUT'
AND T_BOOK.AUTHOR_ID = a.ID);
I jak można to wyrazić w jOOQ:
// Alias the author table
TAuthor a = T_AUTHOR.as("a");
// Use the aliased table in the select statement
create.selectFrom(a)
.whereExists(create.selectOne()
.from(T_BOOK)
.where(T_BOOK.STATUS.equal(TBookStatus.SOLD_OUT)
.and(T_BOOK.AUTHOR_ID.equal(a.ID))))));
Hibernacja, ponieważ jest to po prostu standard defacto w Javie i był jedną z sił napędowych w tworzeniu JPA. Ma doskonałą obsługę na wiosnę i obsługuje ją prawie każda platforma Java. Wreszcie, GORM jest naprawdę fajnym narzędziem do tworzenia dynamicznych wyszukiwarek itd. Przy użyciu Groovy.
Został nawet przeniesiony do .NET (NHibernate), więc możesz go również tam używać.
Hibernacja, ponieważ:
Kilka punktów, dlaczego (i kiedy) używać ORM:
Polecam korzystanie z MyBatis . Jest to cienka warstwa na JDBC, bardzo łatwo jest mapować obiekty na tabele i nadal używać zwykłego SQL, wszystko jest pod twoją kontrolą.
Miałem naprawdę dobre doświadczenia z Avaje Ebean, kiedy pisałem średniej wielkości aplikację JavaSE.
Używa standardowych adnotacji JPA do definiowania jednostek, ale udostępnia znacznie prostszy interfejs API (brak bzdury EntityManager lub dowolnego z tych dołączonych / odłączonych elementów) Pozwala także w razie potrzeby łatwo używać zapytań SQL lub zwykłych wywołań JDBC zdarzeń.
Ma również bardzo ładny płynny i bezpieczny dla API interfejs do zapytań. Możesz pisać takie rzeczy jak:
List<Person> boys = Ebean.find(Person.class)
.where()
.eq("gender", "M")
.le("age", 18)
.orderBy("firstName")
.findList();
SimpleORM , ponieważ jest prosty i nie ma magii. Definiuje wszystkie struktury metadanych w kodzie Java i jest bardzo elastyczny.
SimpleORM zapewnia funkcjonalność podobną do Hibernacji poprzez mapowanie danych w relacyjnej bazie danych na obiekty Java w pamięci. Zapytania można określać w odniesieniu do obiektów Java, tożsamość obiektu jest dopasowywana do kluczy bazy danych, utrzymywane są relacje między obiektami, a zmodyfikowane obiekty są automatycznie opróżniane do bazy danych z optymistycznymi blokadami.
Ale w przeciwieństwie do Hibernacji, SimpleORM wykorzystuje bardzo prostą strukturę i architekturę obiektów, która eliminuje potrzebę złożonego analizowania, przetwarzania kodu bajtowego itp. SimpleORM jest mały i przezroczysty, pakowany w dwa słoiki o wielkości zaledwie 79K i 52K, z tylko jednym małym i opcjonalnym zależność (Slf4j). (Hibernacja ma ponad 2400 KB plus około 2000 KB zależnych słoików). To sprawia, że SimpleORM jest łatwy do zrozumienia, a zatem znacznie zmniejsza ryzyko techniczne.
Eclipse Link , z wielu powodów, ale przede wszystkim czuję, że ma mniej wzdęć niż inne główne rozwiązania strumieniowe (co najmniej mniej wzdęć na twarzy).
Aha i Eclipse Link został wybrany jako referencyjna implementacja JPA 2.0
Chociaż podzielam obawy dotyczące zastępowania Java w zapytaniach SQL w dowolnej formie, naprawdę myślę, że ludzie krytykujący ORM robią to z powodu ogólnie złego projektu aplikacji.
True OOD jest sterowany przez klasy i relacje, a ORM zapewnia spójne mapowanie różnych typów relacji i obiektów. Jeśli użyjesz narzędzia ORM i skończysz na kodowaniu wyrażeń zapytań w dowolnym języku zapytań obsługiwanym przez strukturę ORM (w tym między innymi drzewa wyrażeń Java, metody zapytań, OQL itp.), Zdecydowanie robisz coś złego, tzn. Model klasy najprawdopodobniej nie spełnia twoich wymagań tak, jak powinno. Czysty projekt aplikacji tak naprawdę nie wymaga zapytań na poziomie aplikacji. Refaktoryzowałem wiele projektów, od których ludzie zaczęli używać frameworku ORM w taki sam sposób, w jaki używali ich do osadzania stałych ciągów SQL w swoim kodzie, a na koniec wszyscy byli zaskoczeni, jak prosta i łatwa w utrzymaniu jest cała aplikacja po dopasowaniu ulepszyć swój model klasy za pomocą modelu użytkowania. To prawda, że do takich rzeczy jak funkcja wyszukiwania itp. Potrzebujesz języka zapytań, ale nawet wtedy zapytania są tak bardzo ograniczone, że tworzenie nawet złożonego WIDOKU i odwzorowanie go na trwałą klasę tylko do odczytu jest o wiele przyjemniejsze w utrzymaniu i analizie niż budowanie wyrażeń w języku zapytań w kodzie aplikacji. Podejście VIEW wykorzystuje również możliwości baz danych, a dzięki materializacji może być znacznie lepsze pod względem wydajności niż jakikolwiek odręczny SQL w źródle Java. Nie widzę więc żadnego powodu, by nietrywialna aplikacja NIE korzystała z ORM. ale nawet wtedy zapytania są tak bardzo ograniczone, że tworzenie nawet złożonego WIDOKU i mapowanie go na trwałą klasę tylko do odczytu jest o wiele łatwiejsze w utrzymaniu i oglądaniu niż budowanie wyrażeń w języku zapytań w kodzie aplikacji. Podejście VIEW wykorzystuje również możliwości baz danych, a dzięki materializacji może być znacznie lepsze pod względem wydajności niż jakikolwiek odręczny SQL w źródle Java. Nie widzę więc żadnego powodu, by nietrywialna aplikacja NIE korzystała z ORM. ale nawet wtedy zapytania są tak bardzo ograniczone, że tworzenie nawet złożonego WIDOKU i mapowanie go na trwałą klasę tylko do odczytu jest o wiele łatwiejsze w utrzymaniu i oglądaniu niż budowanie wyrażeń w języku zapytań w kodzie aplikacji. Podejście VIEW wykorzystuje również możliwości baz danych, a dzięki materializacji może być znacznie lepsze pod względem wydajności niż jakikolwiek odręczny SQL w źródle Java. Nie widzę więc żadnego powodu, by nietrywialna aplikacja NIE korzystała z ORM.