Hibernate vs JPA vs JDO - ưu và nhược điểm của từng loại? [đóng cửa]


174

Tôi quen thuộc với ORM như một khái niệm và thậm chí tôi đã sử dụng nHibernate vài năm trước cho một dự án .NET; tuy nhiên, tôi không theo kịp chủ đề ORM trong Java và chưa có cơ hội sử dụng bất kỳ công cụ nào trong số này.

Nhưng, bây giờ tôi có thể có cơ hội bắt đầu sử dụng một số công cụ ORM cho một trong các ứng dụng của chúng tôi, trong nỗ lực tránh xa hàng loạt dịch vụ web cũ.

Tôi đang gặp khó khăn khi nói về sự khác biệt giữa các thông số JPA, những gì bạn nhận được với chính thư viện Hibernate và những gì JDO cung cấp.

Vì vậy, tôi hiểu rằng câu hỏi này hơi mở, nhưng tôi đã hy vọng nhận được một số ý kiến ​​về:

  • Những ưu và nhược điểm của mỗi là gì?
  • Mà bạn sẽ đề nghị cho một dự án mới?
  • Có những điều kiện nhất định khi sử dụng một khung so với khung kia có ý nghĩa không?

Câu trả lời:


112

Một số lưu ý:

  • JDO và JPA đều là thông số kỹ thuật, không triển khai.
  • Ý tưởng là bạn có thể trao đổi các triển khai JPA, nếu bạn hạn chế mã của mình chỉ sử dụng JPA tiêu chuẩn. (Ditto cho JDO.)
  • Hibernate có thể được sử dụng như một cách triển khai JPA như vậy.
  • Tuy nhiên, Hibernate cung cấp API gốc, với các tính năng trên và vượt xa so với JPA.

IMO, tôi muốn giới thiệu Hibernate.


Đã có một số ý kiến ​​/ câu hỏi về những gì bạn nên làm nếu bạn cần sử dụng các tính năng dành riêng cho Hibernate. Có nhiều cách để xem xét điều này, nhưng lời khuyên của tôi sẽ là:

  • Nếu bạn không lo lắng về triển vọng liên kết của nhà cung cấp, thì hãy lựa chọn giữa Hibernate và các triển khai JPA và JDO khác bao gồm các phần mở rộng cụ thể của nhà cung cấp trong quá trình ra quyết định của bạn.

  • Nếu bạn lo lắng về triển vọng liên kết của nhà cung cấp và bạn không thể sử dụng JPA mà không dùng đến các tiện ích mở rộng cụ thể của nhà cung cấp, thì đừng sử dụng JPA. (Ditto cho JDO).

Trong thực tế, có lẽ bạn sẽ cần phải đánh đổi mức độ lo lắng của nhà cung cấp so với mức độ bạn cần những tiện ích mở rộng cụ thể của nhà cung cấp đó.

Và cũng có những yếu tố khác, như bạn / nhân viên của bạn biết rõ các công nghệ tương ứng như thế nào, sản phẩm sẽ có giá bao nhiêu khi cấp phép và câu chuyện mà bạn tin về những gì sẽ xảy ra trong tương lai cho JDO và JPA.


8
bộ công cụ, đẹp và ngắn. Một điểm đáng nói nữa là JPA không ngăn sử dụng các tính năng cụ thể triển khai nếu cần thiết. Điều đó có nghĩa là JPA cho phép bạn sử dụng bất kỳ tính năng Hibernate nào khi Hibernate là một triển khai.
topchef

1
Những lợi thế của việc sử dụng JPA là gì nếu tôi cần một số tính năng cụ thể từ Hibernate?
Bruno Reis

22
Một lưu ý quan trọng cần được thêm vào: Mặc dù JPA và JDO đều có hỗ trợ tuyệt vời cho RDBMSes, JDO là "bất khả tri" và do đó không giới hạn trong thế giới RDBMS. Với sự khởi sắc của NoQuery tại thời điểm này, một người sẽ khôn ngoan khi cân nhắc sử dụng một tiêu chuẩn bền bỉ để tránh việc khóa các ứng dụng của họ vào thế giới * SQL truyền thống. Các ứng dụng JDO có thể dễ dàng được triển khai các kho dữ liệu không phải RDBMS. Danh sách đầy đủ các kho dữ liệu được hỗ trợ có thể được tìm thấy tại: datanucleus.org/products/accesspl platform / datastores.html
Volksman

2
@Golfman tại sao chọn dựa trên những gì có thể xảy ra? Không có gì ngăn cản bạn tiếp tục làm việc khác sau này nếu cuối cùng bạn cần hỗ trợ NoQuery ... KISS
TM.

1
@Bruno - khi bạn đang sử dụng các phần không dành riêng cho Hibernate, bạn đang sử dụng JPA. Rõ ràng, lợi thế của việc hạn chế bản thân đối với JPA thuần túy là bạn có thể chuyển sang thực hiện JPA khác dễ dàng hơn.
Stephen C

69

Hãy chắc chắn rằng bạn đánh giá việc triển khai DataNucleus của JDO. Chúng tôi bắt đầu với Hibernate vì nó dường như rất phổ biến nhưng khá sớm nhận ra rằng đó không phải là một giải pháp bền bỉ minh bạch 100%. Có quá nhiều cảnh báo và tài liệu đầy 'nếu bạn gặp tình huống này thì bạn phải viết mã của mình như thế này', điều đó đã lấy đi niềm vui của việc tự do mô hình hóa và mã hóa theo cách chúng tôi muốn. JDO chưa bao giờ khiến tôi phải điều chỉnh mã hoặc mô hình của mình để làm cho nó hoạt động bình thường '. Tôi chỉ có thể thiết kế và mã hóa các POJO đơn giản như thể tôi sẽ chỉ sử dụng chúng 'trong bộ nhớ', nhưng tôi có thể duy trì chúng trong suốt.

Ưu điểm khác của JDO / DataNucleus so với ngủ đông là nó không có chi phí phản ánh thời gian chạy và hiệu quả bộ nhớ cao hơn vì nó sử dụng tăng cường mã byte thời gian xây dựng (có thể thêm 1 giây vào thời gian xây dựng của bạn cho một dự án lớn) hơn mô hình proxy hỗ trợ phản xạ thời gian chạy của hibernate.

Một điều khác mà bạn có thể thấy khó chịu với Hibernate là một tài liệu tham khảo mà bạn có về những gì bạn nghĩ là đối tượng ... nó thường là 'proxy' cho đối tượng. Không có lợi ích của việc tăng cường mã byte, mẫu proxy được yêu cầu để cho phép tải theo yêu cầu (nghĩa là tránh kéo toàn bộ biểu đồ đối tượng của bạn khi bạn kéo vào một đối tượng cấp cao nhất). Hãy chuẩn bị để ghi đè bằng và mã băm vì đối tượng bạn nghĩ bạn đang tham khảo thường chỉ là proxy cho đối tượng đó.

Đây là một ví dụ về sự thất vọng bạn sẽ nhận được với Hibernate mà bạn sẽ không nhận được với JDO:

http://blog.andrewbeacock.com/2008/08/how-to-im
vây-hibernate-safe-equals.html http://burtbeckwith.com/blog/?p=53

Nếu bạn thích mã hóa thành 'cách giải quyết' thì chắc chắn, Hibernate là dành cho bạn. Nếu bạn đánh giá cao sự phát triển theo hướng mô hình, sạch, hướng đối tượng, trong đó bạn dành toàn bộ thời gian cho mô hình hóa, thiết kế và mã hóa và không có gì trong các cách giải quyết xấu xí thì hãy dành vài giờ để đánh giá JDO / DataNucleus . Số giờ đầu tư sẽ được hoàn trả gấp ngàn lần.

Cập nhật tháng 2 năm 2017

Đã khá lâu rồi DataNucleus 'triển khai tiêu chuẩn duy trì JPA bên cạnh tiêu chuẩn kiên trì JDO, do đó, việc chuyển các dự án JPA hiện tại từ Hibernate sang DataNucleus sẽ rất đơn giản và bạn có thể nhận được tất cả các lợi ích được đề cập ở trên của DataNucleus , nếu có. Vì vậy, về mặt câu hỏi, việc lựa chọn một tiêu chuẩn cụ thể, JPA (chỉ RDBMS) so với JDO (RDBMS + Không SQL + ODBMSes + khác), DataNucleus hỗ trợ cả hai, Hibernate chỉ bị giới hạn ở JPA.

Hiệu suất cập nhật DB Hibernate

Một vấn đề khác cần xem xét khi chọn ORM là hiệu quả của cơ chế kiểm tra bẩn của nó - trở nên rất quan trọng khi cần xây dựng SQL để cập nhật các đối tượng đã thay đổi trong giao dịch hiện tại - đặc biệt là khi có nhiều đối tượng. Có một mô tả kỹ thuật chi tiết về cơ chế kiểm tra bẩn của Hibernate trong câu trả lời SO này: JPA với HIBERNATE chèn rất chậm


3
Và như tất cả chúng ta đều biết, sự tăng cường chính xác là lý do tại sao JDO đã được áp dụng ồ ạt như vậy!
Pascal Thivent 18/03/2016

15
FUD được công bố rộng rãi và lướt sóng thiên văn được thực hiện bởi những người chơi Hibernate chính trong những ngày đầu liên quan đến JDO không có gì thiếu trung thực và kinh tởm và không nghi ngờ gì đã ảnh hưởng đến việc áp dụng JDO. Ngày nay các nhà phát triển biết rằng việc tăng cường mã byte hoàn toàn không phải là vấn đề và thường sử dụng nó cho nhiều mục đích khác nhau ngoài sự kiên trì. Thư viện tăng cường mã byte ASM mới nhanh đến mức bạn thậm chí không có thời gian để hít thở trước khi hoàn thành.
Volksman

7
Thất bại của JDO đã được dự đoán từ khi bắt đầu ( javalulk.org/forums/thread.jspa?forumID=46&threadID=1326 ) và trước Hibernate để bạn không thể đổ lỗi cho Hibernate vì điều đó. Hibernate / Toplink đã thành công khi người chơi Sun và JDO (và OODBMS của họ) thất bại vì họ là câu trả lời tốt hơn tại thời điểm đó, không phải vì tiếp thị và FUD. Giai đoạn = Stage. Ai quan tâm nếu ASM đang bùng cháy nhanh ngày hôm nay , nó đã không ở đó hơn 5 năm trước, khi cần và JDO chỉ đơn giản là thua trận. JDO có vượt trội về mặt khái niệm? Quá tệ, nó đã thất bại khi thực hiện chiến thắng đúng hạn (và sẽ không quay lại vì JPA).
Pascal Thivent

2
Để minh họa cho lời nói của tôi (một bài đăng khác minh họa nỗi đau mà mọi người đang cảm thấy trong quá trình phát triển hoặc tại sao Hibernate đã chiến thắng trận chiến): mail-archive.com/open-jpa-dev@incubator.apache.org/ . Tôi thấy rõ ràng rằng sự phản chiếu / cglib là một câu trả lời thiết thực cho các vấn đề của mọi người (và mọi người không quan tâm nếu API vượt trội về mặt khái niệm nếu nó gây khó khăn khi sử dụng) và tôi không thấy bất kỳ người chơi quan trọng nào của Hibernate ở đây, chỉ là người dùng . Vì vậy, cuối cùng tôi tự hỏi ai đang truyền bá FUD thực sự ...
Pascal Thivent

7
Chà, điều này chắc chắn không giống như ngày xưa khi có ít nhất 17 bài đăng FUD chuyên nghiệp khác nhau (nhưng chỉ đến từ 3 địa chỉ IP khác nhau. Làm toán cho mọi người =)).
Volksman

54

Gần đây tôi đã đánh giá và chọn một khung kiên trì cho một dự án java và kết quả của tôi như sau:

Những gì tôi đang thấy là sự hỗ trợ có lợi cho JDO chủ yếu là:

  • bạn có thể sử dụng các nguồn dữ liệu không phải là sql, db4o, hbase, ldap, bigtable, couchdb (plugin cho cassandra), v.v.
  • bạn có thể dễ dàng chuyển từ nguồn dữ liệu sql sang nguồn dữ liệu không phải sql và ngược lại.
  • không có đối tượng proxy và do đó ít đau hơn đối với việc triển khai hashcode () và bằng ()
  • POJO nhiều hơn và do đó cần ít cách giải quyết hơn
  • hỗ trợ nhiều mối quan hệ và loại trường

và sự hỗ trợ có lợi cho JPA là chủ yếu:

  • phổ biến hơn
  • jdo đã chết
  • không sử dụng tăng cường mã byte

Tôi đang thấy rất nhiều bài viết ủng hộ JPA từ các nhà phát triển JPA, những người rõ ràng không sử dụng JDO / Datanucleus cung cấp các đối số yếu cho việc không sử dụng JDO.

Tôi cũng đang thấy rất nhiều bài đăng từ người dùng JDO đã di chuyển sang JDO và kết quả là hạnh phúc hơn nhiều.

Đối với JPA là phổ biến hơn, có vẻ như điều này một phần là do sự hỗ trợ của nhà cung cấp RDBMS chứ không phải là nó vượt trội về mặt kỹ thuật. (Âm thanh như VHS / Betamax với tôi).

JDO và triển khai tham chiếu của nó Datanucleus rõ ràng không chết, như được thể hiện bằng việc áp dụng nó cho GAE và phát triển tích cực trên mã nguồn (http://sourceforge.net/projects/datanucleus/).

Tôi đã thấy một số khiếu nại về JDO do tăng cường mã byte, nhưng chưa có lời giải thích nào cho lý do tại sao nó xấu.

Trong thực tế, trong một thế giới ngày càng bị ám ảnh bởi các giải pháp NoQuery, JDO (và việc triển khai datanucleus) dường như an toàn hơn nhiều.

Tôi mới bắt đầu sử dụng JDO / Datanucleus và đã thiết lập nó để tôi có thể dễ dàng chuyển đổi giữa việc sử dụng db4o và mysql. Thật hữu ích cho việc phát triển nhanh để sử dụng db4o và không phải lo lắng quá nhiều về lược đồ DB và sau đó, khi lược đồ được ổn định để triển khai vào cơ sở dữ liệu. Tôi cũng cảm thấy tự tin rằng sau này, tôi có thể triển khai tất cả / một phần ứng dụng của mình lên GAE hoặc tận dụng lưu trữ phân tán / giảm bản đồ một la hbase / hadoop / cassandra mà không cần tái cấu trúc quá nhiều.

Tôi thấy trở ngại ban đầu khi bắt đầu với Datanucleus hơi khó khăn - Tài liệu trên trang web datanucleus hơi khó để vào - các hướng dẫn không dễ thực hiện như tôi muốn. Phải nói rằng, tài liệu chi tiết hơn về API và ánh xạ là rất tốt khi bạn vượt qua giai đoạn học tập ban đầu.

Câu trả lời là, nó phụ thuộc vào những gì bạn muốn. Tôi thà có mã sạch hơn, không có nhà cung cấp khóa, định hướng pojo hơn, các tùy chọn nosql phổ biến hơn.

Nếu bạn muốn cảm giác ấm áp cầu kỳ mà bạn đang làm giống như phần lớn các nhà phát triển / cừu khác, hãy chọn JPA / hibernate. Nếu bạn muốn dẫn đầu trong lĩnh vực của mình, hãy lái thử JDO / Datanucleus và làm cho tâm trí của bạn lên.


9
Thật ra, như tôi đã nói, tôi chỉ đưa ra những ấn tượng của mình về những gì tôi đã khám phá được trong khi cố gắng chọn một giải pháp. Vâng, tôi là người mới bắt đầu sử dụng Java, tại sao điều đó phải liên quan? Mặt khác, bạn đã đăng một số lần nêu ý kiến ​​của bạn rằng JDO đã chết mà không đưa ra bất kỳ sự thật hay bằng chứng nào để chứng minh điều đó và không thừa nhận các lĩnh vực kỹ thuật nơi JDO rõ ràng là vượt trội. Bạn rõ ràng có một cái gì đó cá nhân chống lại JDO / Datanucleus và đang sử dụng các luồng này như một phương tiện để duy trì lập trường chống JDO của bạn.
Tom

4
Pascal - bạn đang tranh cãi vào một góc ở đây. Tôi nghĩ rằng bạn đang thiếu điểm của phần Quảng cáo của Câu hỏi thường gặp. OP đã hỏi ý kiến ​​về 2 công nghệ. Nó đang mời những người ủng hộ hai bên tiến lên và trình bày những lời chỉ trích / khuyến nghị mang tính xây dựng của họ. Đối với Andy / Datanucleus và những người dùng JDO khác để làm nổi bật các mặt tích cực của JDO và chống lại những lời chỉ trích là không quảng cáo nhiều hơn những người khác ở đây khuyên bạn nên sử dụng chế độ ngủ đông.
Tom

5
Bạn có thể làm tốt để tham khảo phần Câu hỏi thường gặp có nội dung 'Hãy tử tế' cho các bài đăng của bạn về chủ đề này đã bị buộc tội, đối đầu hoặc thô lỗ. Đầu tiên của bạn là một bình luận mỉa mai về tăng cường. Thứ hai; một lời ca ngợi về những khó khăn của việc thực hiện sớm và không còn phù hợp. Thứ ba là một sự nhạo báng trẻ con và xúc phạm những người không muốn sử dụng RDBMS. Thứ tư là mỉa mai chế giễu một người có quan điểm khác với bạn. Thứ năm là một cuộc tấn công; gọi tôi là một con vẹt. Bạn có nghĩ điều này 'Trở nên tốt đẹp' không?
Tom

3
Nếu bạn đã có một trải nghiệm khủng khiếp với JDO, sau đó giải thích điều gì là khủng khiếp, hãy thừa nhận rằng đó là phiên bản cũ hơn và mọi thứ có thể đã được cải thiện kể từ đó. Bạn cũng cần nhận ra rằng những người khác có thể có những nhu cầu khác nhau đối với bạn. Chỉ vì bạn 'hài lòng' với JPA và muốn sử dụng RDBMS không có nghĩa là những người khác. Có lẽ trong sự vội vàng của bạn để tăng danh tiếng của bạn, bạn đã đánh mất tầm nhìn về danh tiếng đó là gì? ps. Là một nhà phát triển, bạn thực sự cần quan tâm đến sự thịnh vượng của các dự án như vậy, đó là điều thúc đẩy sự đổi mới và giảm sự khóa của nhà cung cấp.
Tom

6
Đây sẽ là câu trả lời cuối cùng của tôi :) .. 1. Nếu nó không liên quan đến câu hỏi tại sao lại nâng nó lên? 2. Tôi chưa bao giờ đặt câu hỏi về sự trung thực của bạn, tôi nói rằng bạn không tử tế với những người đăng khác và rằng bạn tự mâu thuẫn với chính mình. 3. không ai đề nghị bạn tóm tắt hơn 8 năm - nhưng hãy sao lưu các tuyên bố của bạn bằng các sự kiện và ví dụ thay vì các tuyên bố chủ quan có khả năng xúc phạm. 5. Thái độ 'hibernate / jpa / jboss là xấu xa' trên bài đăng này ở đâu? Tôi không thấy nó Tôi chỉ thấy những bình luận chống JDO của bạn.
Tom

40

Mà bạn sẽ đề nghị cho một dự án mới?

Tôi cũng không đề nghị! Sử dụng Spring DAO JdbcTemplatecùng với StoredProcedure, RowMapperRowCallbackHandlerthay vào đó.

Kinh nghiệm cá nhân của tôi với Hibernate là thời gian lưu trước được bù đắp nhiều hơn bởi những ngày bất tận bạn sẽ dành hết thời gian để cố gắng hiểu và gỡ lỗi các vấn đề như hành vi cập nhật xếp tầng bất ngờ.

Nếu bạn đang sử dụng một DB quan hệ thì mã của bạn càng gần nó, bạn càng có nhiều quyền kiểm soát. Lớp DAO của Spring cho phép kiểm soát tốt lớp ánh xạ, đồng thời loại bỏ sự cần thiết của mã soạn sẵn. Ngoài ra, nó tích hợp vào lớp giao dịch của Spring, điều đó có nghĩa là bạn có thể dễ dàng thêm (thông qua AOP) hành vi giao dịch phức tạp mà không xâm nhập vào mã của bạn (tất nhiên, bạn cũng nhận được điều này với Hibernate).


4
đây rõ ràng là lựa chọn ánh xạ quan hệ đối tượng (ORM) được điều khiển bởi người dùng lớn và cơ sở mã được tích lũy kể từ thời ODBC (đầu thập niên 90) (đọc di sản). Không có lý do gì để không sử dụng JDBC (có hoặc không có Spring) trừ khi bạn chọn tiếp tục và sử dụng khung ORM. Hãy nghĩ về những người mà một ngày nào đó đã quyết định bỏ FORTRAN để sử dụng C hoặc Pascal.
topchef

23
@grigory - Tôi nói với nhiều kinh nghiệm về việc lãng phí nhiều ngày để cố gắng hiểu các vấn đề của Hibernate, chẳng hạn như cập nhật / xóa tầng, cấu trúc truy vấn không hiệu quả một cách lố bịch, v.v. Như vậy, không chắc rằng kiến ​​thức về một mình Hibernate sẽ dẫn đến một sản phẩm cuối tốt. Theo kinh nghiệm của tôi, qua vòng đời dự án, Hibernate (và ORM theo tiện ích mở rộng) tốn nhiều thời gian hơn so với tiết kiệm
oxbow_lakes

8
xin lỗi vì bạn đã có kinh nghiệm kém như vậy với Hibernate. Bản thân tôi đến từ cơ sở dữ liệu nặng / SQL / thủ tục lưu trữ / trường JDBC. Tôi không thể nói tôi đang chuyển đổi - mọi công nghệ ở trên vẫn có một vị trí. Nhưng với mục đích chung, ứng dụng 3 tầng Java (dù ở quy mô nào), lựa chọn đầu tiên là công nghệ ORM - tốt nhất là JPA 2. Các ứng dụng khác phải được xem xét dựa trên các yếu tố như mã kế thừa, tích hợp, chuyên môn, yêu cầu hàng loạt, thời gian thực hiệu suất, vv có thể điều khiển (hoặc có thể không) tiếp cận với ngăn xếp công nghệ cơ sở dữ liệu khác nhau.
topchef

3
Tôi hoàn toàn không đồng ý với định nghĩa "thắng nhanh" ở trên - chỉ cần lấy Hibernate in Action ( stackoverflow.com/questions/96729/ mẹo ) (và đó là JPA 1, với JPA 2, nó chỉ trở nên tốt hơn) để hiểu đầy đủ về sức mạnh và bảo hiểm công nghệ này có.
topchef

7
Tôi đã thực hiện một nghiên cứu nhỏ và Spring không còn đề xuất Spring DAO ( static.springsource.org/spring/docs/3.0.x/ .): "Phong cách tích hợp được đề xuất là mã hóa DAO chống lại API Hibernate, JPA và JDO đơn giản. kiểu cũ hơn của việc sử dụng các mẫu DAO của Spring không còn được khuyến nghị nữa; "... Đây có phải là những gì bạn đã đề xuất không? Nếu vậy, tại sao họ không đề nghị nó?
dùng1

23

JDO đã chết

JDO không thực sự chết vì vậy hãy kiểm tra sự thật của bạn. JDO 2.2 được phát hành vào tháng 10 năm 2008 JDO 2.3 đang được phát triển.

Điều này được phát triển công khai, dưới Apache. Nhiều bản phát hành hơn JPA đã có, và đặc điểm kỹ thuật ORM của nó vẫn đi trước cả các tính năng được đề xuất của JPA2


12
Mọi người chắc chắn đang sử dụng nó, bằng chứng là nhiều người dùng mà DataNucleus có, không bao giờ bận tâm đến Xcalia, Kodo. Bạn bỏ lỡ ý tưởng cơ bản rằng JDO và JPA không lấp đầy cùng một thị trường. JPA là RDBMS độc quyền. JDO là bất khả tri về kho dữ liệu và được sử dụng cho RDBMS, nhưng cũng là LDAP, XML, Excel, OODBM, v.v.
DataNucleus

3
Tôi thích yếu tố không phải RDBMS, đặc biệt với sự gia tăng phổ biến của các giải pháp không phải RDBMS, đó là một vấn đề lớn. Điều này có nghĩa là nếu JPA không phát triển đủ nhanh, thì sự sẵn có của một "thay thế linh hoạt hơn" và linh hoạt hơn (JDO) có nghĩa là sự phổ biến của JPA sẽ có xu hướng đi xuống, không cần thiết. Đừng bận tâm đến các lập luận kỹ thuật rằng JDO hoàn thiện hơn, vượt trội hơn, trưởng thành hơn hoặc bất cứ điều gì khác - đó sẽ không phải là vấn đề ưu tiên . Điều hợp lý là các nhà cung cấp RDBMS đang hành xử đáng ngờ - thời kỳ thống trị thị trường RDBMS có thể sắp kết thúc.
Manius

Chúng tôi vẫn đang sử dụng JDO / DataNucleus vào năm 2019! Hiện đã lên đến Phiên bản 5.x và vẫn đánh bại Hibernate về năng suất và hiệu suất thời gian chạy của nhà phát triển. Gần đây tôi đã phải thực hiện một số tư vấn về một ứng dụng web lớn bằng Hibernate và đã được nhắc nhở về nỗi đau mà tôi phải chịu khi tôi là một người sử dụng và quảng bá HIbernate hoạt động nhiều năm trước, Một trưởng nhóm không tin tôi khi tôi nói với cô ấy rằng lĩnh vực BLOB của cô ấy luôn luôn háo hức tìm kiếm mặc dù nó được đánh dấu là lười biếng tìm nạp. Việc thiếu hoàn toàn kiến ​​thức "dưới vỏ bọc" của một chuyên gia Hibernate tự xưng là "có kinh nghiệm" đã rất đáng lo ngại nhưng đáng mong đợi.
Volksman


10

Tôi đang sử dụng JPA (triển khai OpenJPA từ Apache, dựa trên cơ sở mã KODO JDO đã hơn 5 năm tuổi và cực kỳ nhanh / đáng tin cậy). IMHO bất cứ ai nói với bạn bỏ qua các thông số kỹ thuật là cho bạn lời khuyên tồi. Tôi đặt thời gian vào và chắc chắn đã được khen thưởng. Với JDO hoặc JPA, bạn có thể thay đổi nhà cung cấp với các thay đổi tối thiểu (JPA có ánh xạ orm để chúng tôi nói chuyện ít hơn một ngày để có thể thay đổi nhà cung cấp). Nếu bạn có hơn 100 bảng như tôi thì điều này là rất lớn. Thêm vào đó, bạn nhận được bộ nhớ đệm dựng sẵn với các lần xóa bộ nhớ cache theo cụm và tất cả đều tốt. SQL / Jdbc tốt cho các truy vấn hiệu suất cao nhưng tính bền bỉ trong suốt vượt trội hơn nhiều so với việc viết các thuật toán và thói quen nhập dữ liệu của bạn. Tôi chỉ có khoảng 16 truy vấn SQL trong toàn bộ hệ thống của mình (50k + dòng mã).


8

Tôi đã tự mình xem xét vấn đề này và không thể tìm thấy sự khác biệt mạnh mẽ giữa hai điều này. Tôi nghĩ rằng sự lựa chọn lớn là trong đó bạn sử dụng thực hiện. Đối với bản thân tôi, tôi đã xem xét nền tảng DataNucleus vì đây là một triển khai bất khả tri lưu trữ dữ liệu của cả hai.


6
+1 cho DataNucleus, không phải cho câu trả lời.
WolfmanDragon

8

Bất cứ ai nói rằng JDO đã chết là một người mong muốn FUD lướt sóng và họ biết điều đó.

JDO vẫn còn sống và tốt. Đặc điểm kỹ thuật vẫn mạnh mẽ, trưởng thành và tiên tiến hơn so với JPA trẻ hơn và bị hạn chế.

Nếu bạn muốn giới hạn bản thân mình chỉ những gì có sẵn trong tiêu chuẩn JPA, bạn có thể viết thư cho JPA và sử dụng DataNucleus như một triển khai bền bỉ, minh bạch hơn so với các triển khai khác của JPA. Tất nhiên DataNucleus cũng thực hiện tiêu chuẩn JDO nếu bạn muốn tính linh hoạt và hiệu quả của việc mô hình hóa mà JDO mang lại.


1
Hoặc bạn sử dụng một triển khai (tốt) khác với một cộng đồng lớn hơn nhiều và do đó phản ứng nhanh hơn. Vâng, một số người cũng quan tâm đến điều đó.
Pascal Thivent 18/03/2016

1
Và bạn nói về FUD> :) Hài hước.
Pascal Thivent

2
Nhận xét của bạn dường như cho rằng tôi đã không sử dụng cả Hibernate và JDO.
Volksman

2
Chủ đề này dường như có rất nhiều tài liệu tham khảo từ một vài người cho đến DataNucleus tuyệt vời như thế nào. Vui lòng không sử dụng địa điểm này làm nền tảng quảng cáo của bạn.
TM.

3
Không có gì đáng ngạc nhiên từ Golfman, người đã lặp đi lặp lại cùng một thứ tiếp thị tuyệt vọng trong mọi chủ đề liên quan đến JPA hoặc DataNucleus (mà anh ta đang sử dụng từ năm 1996 , trước khi nó tồn tại !).
Pascal Thivent

2

Tôi đã sử dụng Hibernate (triển khai JPA) và JPOX (triển khai JDO) trong cùng một dự án. JPOX hoạt động tốt, nhưng gặp phải lỗi khá nhanh, ở đó một số tính năng ngôn ngữ Java 5 không hỗ trợ tại thời điểm đó. Nó có vấn đề khi chơi tốt với các giao dịch XA. Tôi đã tạo ra lược đồ cơ sở dữ liệu từ các đối tượng JDO. Nó muốn kết nối với cơ sở dữ liệu mỗi lần gây phiền nhiễu nếu kết nối Oracle của bạn không hoạt động.

Sau đó chúng tôi chuyển sang Hibernate. Chúng tôi đã đùa giỡn với việc chỉ sử dụng JPA thuần túy trong một thời gian, nhưng chúng tôi cần sử dụng một số tính năng cụ thể của Hibernate để thực hiện ánh xạ. Chạy cùng một mã trên nhiều cơ sở dữ liệu là rất dễ dàng. Hibernate dường như lưu trữ các đối tượng mạnh mẽ hoặc đôi khi có hành vi bộ đệm lạ. Có một số cấu trúc DDL mà Hibernate không thể xử lý và do đó chúng được xác định trong một tệp bổ sung được chạy để khởi tạo cơ sở dữ liệu. Khi tôi gặp phải vấn đề Hibernate, thường có nhiều người gặp phải vấn đề tương tự, điều này khiến cho việc tìm kiếm giải pháp trở nên dễ dàng hơn. Cuối cùng, Hibernate dường như được thiết kế tốt và đáng tin cậy.

Một số người trả lời khác đã đề nghị chỉ sử dụng SQL. Trường hợp sử dụng sát thủ thực sự cho ánh xạ quan hệ đối tượng là thử nghiệm và phát triển. Các cơ sở dữ liệu được xây dựng để xử lý khối lượng dữ liệu lớn thường đắt tiền và hoặc chúng khó cài đặt. Họ rất khó để kiểm tra với. Có rất nhiều cơ sở dữ liệu Java trong bộ nhớ có thể được sử dụng để kiểm tra, nhưng thường vô dụng đối với sản xuất. Có thể sử dụng một cơ sở dữ liệu thực, nhưng có giới hạn, sẽ tăng năng suất phát triển và độ tin cậy của mã.


1
Theo như tôi có thể nói, JPOX đã đổi tên thành DataNucleus (và đã có bản phát hành kể từ đó).
Donal Fellows

2
Hãy nghĩ rằng bạn thực sự sẽ thấy rằng DataNucleus có ít lỗi mở hơn các phần mềm khác mà bạn giới thiệu. Hãy nghĩ rằng bạn cũng sẽ thấy rằng việc phát triển DataNucleus đang giảm số lượng lỗi với tốc độ nhanh hơn so với các phần mềm khác.
DataNucleus

1

Tôi đã tạo một WebApp mẫu vào tháng 5 năm 2012 sử dụng JDO 3.0 & DataNucleus 3.0 - hãy xem nó sạch như thế nào: https://github.com/TorbenVesterager/BadAssWebApp

Có thể nó hơi quá sạch sẽ, vì tôi sử dụng cả POJO cho cơ sở dữ liệu và ứng dụng khách JSON, nhưng điều đó thật thú vị :)

PS: Chứa một vài chú thích SuppressWarnings (được phát triển trong IntelliJ 11)

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.