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?
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?
Câu trả lời:
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 GenericDao
triể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 @Transactional
chú 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.
Có 3 thứ khác nhau mà chúng tôi đang sử dụng ở đây:
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-
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.
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:
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 :)
Spring Data
là 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 JPA
truy vấn thích hợp .
Vị trí của nó trên đỉnh JPA
làm cho việc sử dụng nó hấp dẫn cho:
Các nhà phát triển tân binh không biết SQL
hoặ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.
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 Spring
nó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.
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.
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.