Sự khác biệt giữa Hibernate và Spring Data JPA là gì


207

Sự khác biệt chính giữa Hibernate và Spring Data JPA là gì? Khi nào chúng ta không nên sử dụng Hibernate hoặc Spring Data JPA? Ngoài ra, khi nào mẫu Spring JDBC có thể hoạt động tốt hơn Hibernate / Spring Data JPA?


7
@NeilStockton yêu cầu so sánh giữa hai công nghệ không hỏi ý kiến.
Philip Rego

Câu trả lời:


262

Hibernate là một triển khai JPA, trong khi Spring Data JPA là một trừu tượng truy cập dữ liệu JPA. Spring Data JPA không thể hoạt động mà không có nhà cung cấp JPA.

Spring Data cung cấp một giải pháp cho mẫu DDDRepository hoặc các GenericDaotriển khai tùy chỉnh cũ . Nó cũng có thể tạo các truy vấn JPA thay mặt bạn thông qua các quy ước tên phương thức.

Với Spring Data, bạn có thể sử dụng Hibernate, Eclipse Link hoặc bất kỳ nhà cung cấp JPA nào khác. Một lợi ích rất thú vị của việc sử dụng Spring hoặc Java EE là bạn có thể kiểm soát các ranh giới giao dịch theo cách khai báo bằng cách sử dụng @Transactionalchú thích .

Spring JDBC nhẹ hơn nhiều và nó dành cho truy vấn gốc và nếu bạn chỉ có ý định sử dụng JDBC một mình, thì tốt hơn hết bạn nên sử dụng Spring JDBC để đối phó với tính dài dòng của JDBC.

Do đó, Hibernate và Spring Data là bổ sung chứ không phải đối thủ cạnh tranh.


52
Vì vậy, điều này có nghĩa là Spring Data JPA không thể tồn tại của chính nó? Đó là, dưới mui xe, nó sử dụng một trong những nhà cung cấp JPA (như Hibernate, Eclipselink hoặc bất kỳ nhà cung cấp JPA nào khác)?
CuriousMind

Ý tôi là nếu tôi chỉ sử dụng chế độ ngủ đông thì có rất ít cấu hình cho mức độ ngủ đông, Nếu tôi sử dụng dữ liệu mùa xuân jpa, điều đó có vẻ dễ dàng hơn nhiều so với ngủ đông. Theo nghĩa này tôi đã hỏi bạn câu hỏi đó.
Asif Mushtaq

1
Chính xác hơn, cho đến nay mọi thứ đều hoạt động tốt, bạn chỉ cần hiểu mức cao nhất là Spring Data JPA. Với ngoại lệ đầu tiên, bạn có khả năng phải biết các cấp thấp hơn, ví dụ như Hibernate, JDBC Cơ sở dữ liệu.
Máy bay ném bom Marmite

138

Có 3 thứ khác nhau mà chúng tôi đang sử dụng ở đây:

  1. JPA: Api kiên trì Java cung cấp đặc tả để duy trì, đọc, quản lý dữ liệu từ đối tượng java của bạn đến các quan hệ trong cơ sở dữ liệu.
  2. Hibernate: Có nhiều nhà cung cấp khác nhau thực hiện jpa. Hibernate là một trong số đó. Vì vậy, chúng tôi có nhà cung cấp khác là tốt. Nhưng nếu sử dụng jpa với mùa xuân, nó cho phép bạn chuyển sang các nhà cung cấp khác nhau trong tương lai.
  3. Spring Data JPA: Đây là một lớp khác trên đỉnh của jpa mà mùa xuân cung cấp để làm cho cuộc sống của bạn dễ dàng.

Vì vậy, hãy hiểu làm thế nào dữ liệu mùa xuân jpa và mùa xuân + ngủ đông động-


Dữ liệu mùa xuân JPA:

Giả sử bạn đang sử dụng spring + hibernate cho ứng dụng của mình. Bây giờ bạn cần phải có giao diện dao và triển khai, nơi bạn sẽ viết thao tác crud bằng SessionFactory của hibernate. Giả sử bạn đang viết lớp dao cho lớp Nhân viên, ngày mai trong ứng dụng của bạn, bạn có thể cần phải viết thao tác tương tự cho bất kỳ thực thể nào khác. Vì vậy, có rất nhiều mã soạn sẵn chúng ta có thể thấy ở đây.

Bây giờ dữ liệu Spring jpa cho phép chúng ta xác định các giao diện dao bằng cách mở rộng kho lưu trữ của nó (crudreposeective, jparep repository) để nó cung cấp cho bạn triển khai dao khi chạy. Bạn không cần phải viết triển khai dao nữa. Đó là cách dữ liệu mùa xuân jpa làm cho cuộc sống của bạn dễ dàng.


3
Vì vậy, triển khai cơ sở Spring Data JPA là gì, có phải là ngủ đông không? bởi vì khi tôi sử dụng PagingAndSortingRepousing, nó sẽ hiển thị nhật ký Hibernate trong bảng điều khiển.
Vicky

2
Spring Data JPA đã sử dụng triển khai Hibernate theo mặc định .. Nếu bạn thấy các phụ thuộc quá độ của spring-boot-starter-data-jpa, bạn có thể thấy hibernate-core ở đó
IamVickyAV

28

Tôi không đồng ý SpringJPA làm cho cuộc sống dễ dàng. Vâng, nó cung cấp một số lớp và bạn có thể thực hiện một số DAO đơn giản nhanh chóng, nhưng trên thực tế, đó là tất cả những gì bạn có thể làm. Nếu bạn muốn làm gì đó hơn findById () hoặc lưu, bạn phải đi qua địa ngục:

  • không có quyền truy cập EntityManager trong các lớp org.springframework.data.reposeective (đây là lớp JPA cơ bản!)
  • quản lý giao dịch riêng (giao dịch ngủ đông không được phép)
  • vấn đề lớn với cấu hình nhiều hơn một nguồn dữ liệu
  • không có nguồn dữ liệu tổng hợp (HikariCP phải được sử dụng làm thư viện bên thứ ba)

Tại sao quản lý giao dịch riêng là một bất lợi? Vì Java 1.8 cho phép các phương thức mặc định vào các giao diện, các giao dịch dựa trên chú thích mùa xuân, đơn giản không hoạt động.

Thật không may, SpringJPA dựa trên các phản xạ và đôi khi bạn cần trỏ tên phương thức hoặc gói thực thể vào các chú thích (!). Đó là lý do tại sao bất kỳ tái cấu trúc làm cho sụp đổ lớn. Đáng buồn thay, @Transactional chỉ hoạt động cho DS chính :( Vì vậy, nếu bạn có nhiều hơn một DataSource, hãy nhớ - các giao dịch chỉ hoạt động cho một chính :)

Sự khác biệt chính giữa Hibernate và Spring Data JPA là gì?

Hibernate là đồng hương JPA, tương thích SpringJPA Spring. HibernateJPA DAO của bạn có thể được sử dụng với JavaEE hoặc Hibernate Stand Độc, khi SpringJPA có thể được sử dụng trong Spring - SpringBoot chẳng hạn

Khi nào chúng ta không nên sử dụng Hibernate hoặc Spring Data JPA? Ngoài ra, khi nào mẫu Spring JDBC có thể hoạt động tốt hơn Hibernate / Spring Data JPA?

Chỉ sử dụng Spring JDBC khi bạn cần sử dụng nhiều Joins hoặc khi bạn cần sử dụng Spring có nhiều kết nối nguồn dữ liệu. Nói chung, tránh JPA cho Joins.

Nhưng lời khuyên chung của tôi, hãy sử dụng giải pháp mới giáo dục Daobab ( http://www.daobab.io ). Daobab là Java và bất kỳ nhà tích hợp công cụ JPA nào của tôi và tôi tin rằng nó sẽ giúp ích nhiều cho các nhiệm vụ của bạn :)


2
Daobab, thật sao? Nếu bạn không thích loại an toàn của jpql (tôi không), JPA có API tiêu chí an toàn loại ... JPA tiêu chuẩn tốt hơn so với thay thế kém.
ymajoros

8

Spring Datalà một thư viện tiện lợi trên JPAđó tóm tắt rất nhiều thứ và mang lại phép thuật Mùa xuân (dù muốn hay không) cho truy cập cửa hàng kiên trì. Nó chủ yếu được sử dụng để làm việc với các cơ sở dữ liệu quan hệ. Nói tóm lại, nó cho phép bạn khai báo các giao diện có các phương thức như thế findByNameOrderByAge(String name);sẽ được phân tích cú pháp trong thời gian chạy và chuyển đổi thành các JPAtruy vấn thích hợp .

Vị trí của nó trên đỉnh JPAlàm cho việc sử dụng nó hấp dẫn cho:

  1. Các nhà phát triển tân binh không biết SQLhoặc biết điều đó không tốt. Đây là một công thức cho thảm họa nhưng họ có thể thoát khỏi nó nếu dự án là tầm thường.

  2. Các kỹ sư giàu kinh nghiệm, những người biết những gì họ làm và muốn đẩy nhanh mọi thứ. Đây có thể là một chiến lược khả thi (nhưng đọc thêm).

Từ kinh nghiệm của tôi với Spring Data, ma thuật của nó là quá nhiều (điều này được áp dụng cho Springnói chung). Tôi bắt đầu sử dụng nó rất nhiều trong một dự án và cuối cùng gặp phải một số trường hợp góc mà tôi không thể đưa thư viện ra khỏi đường của mình và kết thúc với cách giải quyết xấu xí. Sau đó tôi đọc các khiếu nại của người dùng khác và nhận ra rằng những vấn đề này là điển hình cho Spring Data. Ví dụ: kiểm tra vấn đề này dẫn đến hàng giờ điều tra / chửi thề:

 public TourAccommodationRate createTourAccommodationRate(
        @RequestBody TourAccommodationRate tourAccommodationRate
    ) {
        if (tourAccommodationRate.getId() != null) {
            throw new BadRequestException("id MUST NOT be specified in a body during entry creation");
        }

        // This is an ugly hack required for the Room slim model to work. The problem stems from the fact that
        // when we send a child entity having the many-to-many (M:N) relation to the containing entity, its
        // information is not fetched. As a result, we get NPEs when trying to access all but its Id in the
        // code creating the corresponding slim model. By detaching the entity from the persistence context we
        // force the ORM to re-fetch it from the database instead of taking it from the cache

        tourAccommodationRateRepository.save(tourAccommodationRate);
        entityManager.detach(tourAccommodationRate);
        return tourAccommodationRateRepository.findOne(tourAccommodationRate.getId());
    }

Cuối cùng tôi đã xuống cấp thấp hơn và bắt đầu sử dụng JDBI- một thư viện đẹp với đủ "ma thuật" để cứu bạn khỏi cái nồi hơi. Với nó, bạn có toàn quyền kiểm soát các truy vấn SQL và gần như không bao giờ phải chống lại thư viện.


Đây là một câu trả lời tốt nhưng nếu bạn có thể liệt kê các trường hợp góc và chi tiết hơn nữa thì nó sẽ rất hữu ích. Nó sẽ trở thành một câu trả lời tuyệt vời. Cảm ơn
John

Chà, thật không dễ để nhớ lại những người đã cho rằng tôi đã không làm việc với Spring Data trong một thời gian dài - tôi sẽ phải xem lại mã cũ và sẽ thêm nhiều bình luận. Tuy nhiên, một trong những điều phiền toái ngay từ đầu tôi - trong JPA rất thường các đối tượng phải tham chiếu lẫn nhau (ví dụ: đối với các hoạt động xếp tầng). Điều này gây ra lỗi Stack Overflow (do tham chiếu vòng tròn) khi Spring cố gắng tuần tự hóa chúng buộc bạn phải thay đổi / giải pháp xấu xí. Vấn đề này là tiếp tuyến với Spring Data vì đây là vấn đề của JPA. Tuy nhiên, vì JPA nằm dưới Spring Data, bạn sẽ nhận được "miễn phí".
raiks

Chỉnh sửa bài đăng và thêm một ví dụ nữa.
raiks

1

Hibernate đang triển khai "JPA", một đặc tả cho các đối tượng Java trong Cơ sở dữ liệu.

Tôi khuyên bạn nên sử dụng wrt JPA vì bạn có thể chuyển đổi giữa các ORMS khác nhau.

Khi bạn sử dụng JDBC thì bạn cần sử dụng SQL Queries, vì vậy nếu bạn thành thạo SQL thì hãy tìm JDBC.


1

Nếu bạn thích sự đơn giản và kiểm soát nhiều hơn đối với các truy vấn SQL thì tôi khuyên bạn nên sử dụng Spring Data / Spring JDBC.

Lượng đường cong học tập tốt của nó trong JPA và đôi khi khó gỡ lỗi. Mặt khác, trong khi bạn có toàn quyền kiểm soát SQL, việc tối ưu hóa truy vấn và cải thiện hiệu suất sẽ trở nên dễ dàng hơn nhiều. Bạn có thể dễ dàng chia sẻ SQL của mình với DBA hoặc ai đó hiểu rõ hơn về Cơ sở dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.