Spring Data JPA khác với Hibernate cho các dự án lớn như thế nào?


129

Tôi đang gặp khó khăn trong việc quyết định xem tôi có nên gắn bó với Hibernate cho một dự án mới hay bị ướt chân với JPA và triển khai Spring Data mới.

Khung dữ liệu Spring dành cho các dự án lớn hay dự án nhỏ với yêu cầu truy vấn khiêm tốn?

Trong khi tôi chắc chắn thấy lợi thế trong việc giảm mã bằng cách sử dụng @Querychú thích, bạn sẽ làm gì cho các truy vấn động? Còn khi bạn muốn thực hiện một phương thức save () khá phức tạp thì sao?

Tài liệu nói rằng để thực hiện một giao diện Tùy chỉnh và triển khai mà kho lưu trữ chính của bạn thực hiện, nhưng nếu bạn cần truy cập bất kỳ phương thức siêu nào trên chính kho lưu trữ thô thì sao? Kho lưu trữ thô thực hiện tùy chỉnh - không phải là cách khác. Có vẻ như một thiết kế kỳ quặc.

Tôi rất không chắc chắn liệu khung này sẽ đáp ứng những thách thức của các ứng dụng phức tạp và lớn. Tôi chưa bao giờ gặp phải nhiều vấn đề với Hibernate và tôi đang cân nhắc việc gắn bó với độ tin cậy cũ tốt hơn là đi với Spring Data JPA.

Tôi nên làm gì? Những biến chứng và chi phí không lường trước nào tôi sẽ gặp phải nếu tôi đi với Spring Data JPA?


1
Theo như tôi biết, nó làm cho rất ít sự khác biệt. Đi với người bạn thấy thoải mái hơn. Tại sao lại tranh luận?
duffymo

1
Tôi rõ ràng là thoải mái hơn với Hibernate, nhưng nếu tôi có thể làm những điều tương tự và có năng suất cao hơn, tôi muốn áp dụng các phương pháp mới hơn. Tuy nhiên, nếu Hibernate vẫn mạnh hơn và tôi sẽ gặp ít vấn đề hơn, thì đó là điều tôi muốn biết.
egervari

3
JPA là một khái quát của ORM sử dụng Hibernate như một trong nhiều triển khai. Những quyền hạn mà bạn đang gán cho cái này hơn cái kia? JPA là một tiêu chuẩn, nhưng tôi thấy rất ít sự khác biệt giữa hai. Vì lợi ích của việc tiết lộ đầy đủ, tôi sẽ nói rằng tôi không quan tâm đến một trong hai. Cả hai đều tạo SQL cho bạn. Tôi muốn viết nó cho mình. ORM không dành cho mọi vấn đề và mọi người dùng.
duffymo

1
Tôi đồng ý. Khi chỉ nói đến JPA hoặc Hibernate, tôi sẽ chọn Hibernate mỗi lần. Tôi thực sự không thích việc thực hiện JPA nhiều như vậy. Hỗ trợ IDE trong IDEA thực sự vẫn khá tệ và nó sẽ phàn nàn nếu ánh xạ không chính xác khi ứng dụng khởi động thay vì để các bài kiểm tra đơn vị chạy. Có rất nhiều nitpicks khác tôi có với JPA. Tôi thực sự rất thích các tệp ánh xạ XML Hibernate cũ. Nó có lợi thế là làm cho các đối tượng của tôi trông bớt lộn xộn hơn rất nhiều. Spring Data JPA cung cấp nhiều tính năng mới, vì vậy cuối cùng tôi đã tự hỏi liệu nó có đáng để chuyển đổi không.
egervari

3
"Dữ liệu mùa xuân" không phải là một triển khai của JPA, hoặc bất cứ điều gì. Nó chỉ đơn giản là thực hiện JPA hiện có và đơn giản hóa những gì bạn cung cấp cho nó. Việc triển khai JPA vẫn thực hiện tất cả các công việc dưới vỏ bọc
Neil Stockton

Câu trả lời:


104

Vì vậy, spring-datacó một số phép thuật bổ sung giúp với các truy vấn phức tạp. Nó là lạ lúc đầu và bạn hoàn toàn bỏ qua nó trong các tài liệu nhưng nó thực sự mạnh mẽ và hữu ích.

Nó liên quan đến việc tạo một tùy chỉnh Repositoryvà một 'Kho lưu trữ' tùy chỉnh và nói với Spring nơi tìm thấy nó. Đây là một ví dụ:

Lớp cấu hình - trỏ đến cấu hình xml vẫn cần thiết của bạn với chú thích trỏ đến gói kho của bạn (hiện tại nó sẽ tìm *Implcác lớp tự động):

@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}

jpa-repositories.xml - cho biết Springnơi tìm kho lưu trữ của bạn. Cũng nói Springđể tìm các kho lưu trữ tùy chỉnh với CustomImpltên tệp:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<jpa:repositories base-package="com.example.repositories" repository-impl-postfix="CustomImpl" />

</beans>

MyObjectRepository- đây là nơi bạn có thể đặt các phương thức truy vấn có chú thích và không được quản lý. Lưu ý cách giao diện kho lưu trữ này mở rộng giao diện Custom:

@Transactional
public interface MyObjectRepository extends JpaRepository<MyObject, Integer>, MyObjectRepositoryCustom {

    List<MyObject> findByName(String name);

    @Query("select * from my_object where name = ?0 or middle_name = ?0")
    List<MyObject> findByFirstNameOrMiddleName(String name);
}

MyObjectRepositoryCustom - các phương thức lưu trữ phức tạp hơn và không thể được xử lý bằng một truy vấn đơn giản hoặc chú thích:

public interface MyObjectRepositoryCustom {

    List<MyObject> findByNameWithWeirdOrdering(String name);
}

MyObjectRepositoryCustomImpl- nơi bạn thực sự thực hiện các phương thức đó với quyền tự động EntityManager:

public class MyObjectRepositoryCustomImpl implements MyObjectRepositoryCustom {

    @Autowired
    private EntityManager entityManager;

    public final List<MyObject> findByNameWithWeirdOrdering(String name) {
        Query query = query(where("name").is(name));
        query.sort().on("whatever", Order.ASC);
        return entityManager.find(query, MyObject.class);
    }
}

Thật ngạc nhiên, tất cả đều đi kèm với nhau và các phương thức từ cả hai giao diện (và giao diện CRUD, bạn triển khai) đều hiển thị khi bạn thực hiện:

myObjectRepository.

Bạn sẽ thấy:

myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()

Nó thực sự làm việc. Và bạn nhận được một giao diện để truy vấn. spring-datathực sự đã sẵn sàng cho một ứng dụng lớn. Và càng nhiều truy vấn bạn có thể đẩy vào đơn giản hoặc chú thích thì càng tốt cho bạn.

Tất cả những điều này được ghi lại tại trang web Spring Data Jpa .

Chúc may mắn.


4
Đây thực sự là những gì tôi đã cố gắng, và nó hoạt động ở một mức độ nào đó. Vấn đề tôi gặp phải là nếu bạn muốn ghi đè save () thì sao? Ví dụ: hãy tưởng tượng bạn đang lưu một blog và bạn muốn xử lý / lưu các thẻ được liên kết với nó trong phương thức save () kể từ khi đưa nó vào một dịch vụ không có ý nghĩa nhất. Điều này rất dễ thực hiện với Hibernate thô, nhưng tôi không thấy một cách hay để làm với Spring JPA. Tôi sẽ đánh dấu câu trả lời của bạn là chính xác bởi vì nó đúng. Về cơ bản đó là những gì bạn có thể làm với Spring Data JPA. Tôi nghĩ rằng tôi sẽ gắn bó với Hibernate mặc dù. Câu trả lời này chắc chắn sẽ giúp người khác.
egervari

8
Bạn có thể tự thực hiện JpaRepository-> MyJpaRepository. Bạn cũng phải tạo một MyJpaRepositoryFactoryBeannhưng nếu bạn thiết lập tất cả chính xác, bạn có thể ghi đè phương thức .save (). Đây là Tài liệu JPA của Spring Data: static.springsource.org/spring-data/data-jpa/docs/c Hiện / không Đừng bỏ cuộc!
sbzoom

@Picrochole làm thế nào để bạn diễn giải 'tầng ứng dụng thấp hơn'? Là dịch vụ, mà gọi DAO thấp hơn trong tầng?
Rumid

12

Tôi đã sử dụng Spring Data JPA trong các dự án lớn và nhỏ với nhu cầu truy vấn đơn giản. Ưu điểm chính là từ thậm chí không phải sử dụng @Querychú thích. Không có gì trong Spring Data ngăn bạn sử dụng nó trong các dự án lớn và sự QueryDSLhỗ trợ gần đây có thể giúp bạn. Đây là một ví dụ về việc sử dụng QueryDSL để nhắm mục tiêu Hibernate.

Nếu bạn thấy trước các truy vấn phức tạp và bạn cảm thấy thoải mái khi sử dụng các đối tượng Hibernate mà không cần JPA, tôi nghĩ rằng một sự kết hợp thay thế có thể có các Dữ liệu Spring đơn giản Repositorybên cạnh các phương thức dựa trên Hibernate phức tạp với các phương thức cụ thể mà bạn có thể cần. Nó có thể ít cồng kềnh hơn khi xoắn một triển khai Hibernate vào cấu trúc Spring Data JPA.


2
Tôi nghĩ rằng tôi muốn sử dụng cùng một api nhất quán cho các truy vấn hơn là trộn và kết hợp trong cùng một dự án. Tôi vẫn chưa tìm thấy một giải pháp tốt cho công cụ jpa dữ liệu mùa xuân phức tạp, và vì có khá nhiều nitpicks với jpa mà tôi có nói chung, tôi nghĩ rằng tôi có thể vui hơn khi chấp nhận ngủ đông như là orm của tôi. Tôi sẽ có rất nhiều truy vấn phức tạp và tôi không đủ khả năng để có một hỗn hợp 40/60. Nó không đáng với tôi :(
egervari

1
Bạn cũng có thể sử dụng Querydsl trực tiếp mà không cần Spring Data, cung cấp cho bạn một lớp truy vấn mạnh mẽ duy nhất trên JPA.
Timo Westkämper

4

Spring JPA sẽ cung cấp cho bạn rất nhiều sự trừu tượng từ việc viết SQL và thậm chí một số HQL bằng cách sử dụng khai báo phương thức truy vấn. Spring JPA tỏa sáng với thế hệ truy vấn của nó, nhưng khi bạn muốn một giải pháp ngủ đông hoàn toàn, bạn có thể tùy chỉnh khi cần vì mùa xuân JPA vẫn dựa trên chế độ ngủ đông. Kiểm tra tài liệu http://static.springsource.org/spring-data/data-jpa/docs/civerse/reference/html để biết thêm thông tin.

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.