2009-11-20 52 views

Trả lời

15

JPA (Java Persistence API) là giao diện cho các nhà cung cấp kiên trì triển khai. Hibernate là một trong những thực hiện như vậy của JPA.

14

Đây là sự ra đời của JSR-000.220 Enterprise JavaBeans 3.0 phát hành cuối cùng (kiên trì):

Tài liệu này là đặc điểm kỹ thuật của Java API cho việc quản lý bền bỉ và đối tượng/rela- mapping tional với Java EE và Java SE. Mục tiêu kỹ thuật của công việc này là cung cấp một cơ sở lập bản đồ đối tượng/quan hệ cho nhà phát triển ứng dụng Java bằng cách sử dụng một mô hình miền Java để man- tuổi một cơ sở dữ liệu quan hệ.

API kiên trì này - cùng với ngôn ngữ truy vấn và siêu dữ liệu ánh xạ đối tượng/quan hệ được xác định trong tài liệu này — bắt buộc phải được hỗ trợ trong Enterprise JavaBeans 3.0. Nó cũng được nhắm mục tiêu sử dụng độc lập với Java SE.

Chuyên gia hàng đầu trong toàn bộ cộng đồng Java đã cùng nhau xây dựng tiêu chuẩn kiên trì Java này. Công trình này kết hợp các đóng góp từ cộng đồng Hibernate, TopLink và JDO, cũng như từ cộng đồng EJB.

Nói cách khác, JPA là tiêu chuẩn hóa API tiêu chuẩn. Hibernate cung cấp việc thực hiện tiêu chuẩn (nghĩa là nó có thể được sử dụng như là công cụ tồn tại cơ bản khi sử dụng JPA).

Trước JPA, Hibernate là một loại tiêu chuẩn thực tế cho sự tồn tại đối tượng trong Java. Hibernate được coi là một đóng góp chính cho JPA vì vậy có rất nhiều điểm tương đồng giữa chúng (tôi thậm chí có thể nói giữa tất cả các giải pháp ORM như các khái niệm ORM là phổ biến). Tuy nhiên, vì nhiều lý do, chính trị hoặc kỹ thuật, nhóm làm việc JPA không thể bao gồm mọi thứ trong bản phát hành đầu tiên của JPA nên JPA thực sự là một tập hợp con của Hibernate (đây là một khung nhìn đơn giản nhưng thực tế rất gần). Hibernate và các triển khai JPA khác cung cấp các phần mở rộng độc quyền của riêng chúng (có nghĩa là các tiêu chuẩn không có nghĩa là không di chuyển từ nhà cung cấp này sang nhà cung cấp khác) theo tiêu chuẩn JPA mà bạn có thể sử dụng hay không.

9

Như đã chỉ ra bởi @Pascal Hibernate tồn tại trước tiêu chuẩn JPA (bây giờ là JSR 317 JPA 2.0, mà Hibernate đã thực hiện trong 3.5 đã được sử dụng sớm). Vì vậy, có các nhà cung cấp khác của JPA, ví dụ: Oracle TopLink, Apache OpenJPA. Để sử dụng đúng JPA trong Hibernate, bạn phải sử dụng EntityManager như được sử dụng cho số Session là một khái niệm Hibernate có sẵn trước JPA. Tương tự đối với JPA nghiêm ngặt, bạn phải sử dụng EntityManagerFactory như được áp dụng cho SessionFactory.

Các số EntityManagerEntityManagerFactory, trên thực tế, các trình bao bọc mỏng xung quanh tương ứng SessionSessionFactory. Ngoài ra, lõi/chú thích Hibernate cung cấp phần mở rộng cho thông số kỹ thuật JPA giúp cuộc sống của bạn dễ dàng hơn. Trước khi JPA 2 Hibernate có một API tiêu chí cho phép bạn lập trình xây dựng một truy vấn theo kiểu OO. JPA 2 bây giờ làm cho tiêu chuẩn chức năng này - tiêu chuẩn JPA là một chút khác nhau từ phiên bản Hibernate vì nó sử dụng Generics. Vì vậy, về cơ bản các chức năng Hibernate là một superset của JPA.

+1

Thật vậy, Hibernate có 'Session' nhưng điều này là không thực sự một khái niệm, nó chỉ là việc thực hiện * đơn vị công việc * mà là một khái niệm ORM được chia sẻ (Toplink có 'UnitOfWork', JDO có' PersistenceManager', Hibernate có 'Session'). –

1

Dưới đây là danh sách một số sự khác biệt giữa các đối tượng (đoạn trích từ tài liệu Hibernate)

  1. Entity. Hibernate vượt quá đặc tả JPA và cung cấp các cấu hình bổ sung. Một số trong số họ được lưu trữ trên @ org.hibernate.annotations.Entity

    • dynamicInsert/dynamicUpdate (mặc định là false)
    • selectBeforeUpdate (mặc định là false)
    • polymorphisms
    • persister
    • optimisticLock (phiên bản, tất cả, bẩn, không có)
  2. id làm thuộc tính sử dụng loại thành phần

    • Mặc dù không được hỗ trợ trong JPA, Hibernate cho phép bạn đặt liên kết của bạn trực tiếp trong thành phần id nhúng (thay vì phải sử dụng các chú thích @MapsId)
  3. Nhiều thuộc tính id không có loại định danh

    • Một cách tiếp cận khác, được cho là tự nhiên hơn là đặt @Id trên nhiều thuộc tính của thực thể của bạn. Cách tiếp cận này chỉ được hỗ trợ bởi Hibernate (không tuân thủ JPA) nhưng không yêu cầu một thành phần có thể nhúng thêm.
  4. thuộc tính id Nhiều với với một loại định danh chuyên

    • Trong khi không phải tiêu chuẩn JPA, Hibernate cho phép của bạn khai báo vani liên quan đến bất động sản trong @IdClass
  5. máy phát điện định danh

    • Định nghĩa mức gói không được hỗ trợ bởi JPA SPE sự đóng đinh. Tuy nhiên, bạn có thể sử dụng @GenericGenerator ở cấp gói
  6. Chú thích

    • Hibernate Annotations hỗ trợ cái gì mà không được hỗ trợ một cách rõ ràng bởi các đặc điểm kỹ thuật JPA. Bạn có thể chú thích một đối tượng được nhúng với chú thích @MappedSuperclass để làm cho các thuộc tính của lớp siêu bền vững (xem @MappedSuperclass để biết thêm thông tin).
  7. phân biệt

    • @ org.hibernate.annotations.DiscriminatorOptions cho phép tùy chọn chỉ định Hibernate tùy chọn phân biệt cụ thể mà không được chuẩn hóa trong JPA.Các tùy chọn sẵn có lực lượng và chèn
  8. giao dịch

    • Hibernate cung cấp chế độ tuôn ra nhiều hơn so với cái được mô tả trong đặc tả JPA. Đặc biệtFlushMode.MANUAL cho cuộc hội thoại dài đang chạy. Vui lòng tham khảo tài liệu tham khảo lõi Hibernate để biết thêm thông tin.
  9. metamodel tĩnh

    • quan trọng. Tính đến ngày hôm nay, siêu mô hình JPA 2 không cung cấp bất kỳ cơ sở nào để truy cập thông tin quan hệ liên quan đến mô hình vật lý. Dự kiến ​​điều này sẽ được giải quyết trong bản phát hành tương lai của đặc điểm kỹ thuật.
Các vấn đề liên quan