2008-09-19 22 views
28

Các nhà phát triển của tôi đang tiến hành một cuộc nội chiến. Trong một trại, họ đã ôm Hibernate và Spring. Trong trại khác, họ đã lên án các khuôn khổ - họ đang xem xét Hibernate.Java Frameworks War: Spring và Hibernate

Câu hỏi đặt ra là: Có bất kỳ điều bất ngờ khó chịu, điểm yếu hoặc pit-falls mà newbie Hibernate-Spring chuyển đổi có khả năng vấp ngã?


PS: Thư viện DAO không phức tạp lắm. Tôi nghi ngờ rằng nó có sự phong phú của Hibernate, nhưng nó đạt đến một số loại trưởng thành (tức là nó không được thay đổi trong vài dự án cuối cùng mà nó được đưa vào).

+2

Oh người đàn ông, tôi ghét nó khi các dự án thoái hóa thành chiến tranh. Xảy ra quá thường xuyên với các đội có quá nhiều nhiệt huyết. –

Trả lời

28

Tôi đã sử dụng Hibernate một số lần trong quá khứ. Mỗi lần tôi chạy vào các trường hợp cạnh, nơi xác định cú pháp được chuyển thành một cuộc săn lùng qua tài liệu, Google và các phiên bản cũ. Nó là một công cụ mạnh mẽ nhưng kém tài liệu (cuối cùng tôi nhìn).

Đối với mùa xuân, hầu như mọi công việc tôi đã phỏng vấn hoặc xem xét trong vài năm qua liên quan đến mùa xuân, nó thực sự trở thành tiêu chuẩn thực tế cho Java/web. Sử dụng nó sẽ giúp các nhà phát triển của bạn có thể tiếp thị nhiều hơn trong tương lai, và nó sẽ giúp bạn khi bạn sẽ có một nhóm lớn những người sẽ hiểu ứng dụng của bạn.

Viết khuôn khổ của riêng bạn là hấp dẫn, giáo dục và thú vị. Không quá tuyệt vời về kết quả.

+2

Hãy cẩn thận. Hibernate cực kỳ mạnh mẽ, nhưng cũng cực kỳ phức tạp. Bạn có thể không cần sự phức tạp của Hibernate, có các tùy chọn khác cho ORM chẳng hạn như SQL Maps, vv Những thứ này có thể được cắm vào Spring. Xem http://static.springframework.org/spring/docs/2.5.x/reference/orm.html để biết chi tiết. – MetroidFan2002

+1

Các khung công tác Spring và OCM thêm rất nhiều sự phức tạp và lập trình trong các tệp XML. Có các khung công tác khác mà bạn có thể chọn để xây dựng các ứng dụng web mà không cần viết riêng của mình. Các thùng chứa OSGi với quản lý thành phần (ví dụ: Apache Felix http://felix.apache.org) đơn giản và linh hoạt hơn nhiều so với các kiểu và khung có dây cứng của Sling như Apache Sling (http://sling.apache.org) sự cần thiết phải viết Bộ điều khiển và các lớp DAO bổ sung hoàn toàn. –

39

Họ đã từ chối khuôn khổ?

Đó là các loại hạt. Nếu bạn không sử dụng khung công tác không có sẵn thì bạn sẽ tự tạo. Nó vẫn là một khuôn khổ.

+2

Tôi cho rằng tôi phóng đại. Có lẽ không phủ nhận ... đúng hơn, họ đã kháng cự với ý tưởng áp dụng các khuôn khổ trong các dự án của họ. – magius

5

Tôi đã không làm việc nhiều với Java nhưng tôi đã làm việc trong các nhóm lớn các nhà phát triển Java. Ấn tượng mà tôi có là mùa xuân là OK. Nhưng mọi người đều buồn bã ở Hibernate. Một nửa đội nếu được hỏi "Nếu bạn có thể thay đổi một điều, bạn sẽ thay đổi điều gì?" và họ sẽ nói "Loại bỏ Hibernate". Khi tôi bắt đầu học Hibernate nó đánh tôi ở mức phức tạp đáng kinh ngạc, nhưng tôi đã không học đủ (may mắn là tôi đã chuyển đi) để biết liệu sự phức tạp có hợp lý hay không (có thể nó cần phải giải quyết một số vấn đề phức tạp).

Nhóm đã loại bỏ Spring có lợi cho Guice, nhưng điều đó giống như một thay đổi chính trị, ít nhất là từ quan điểm của tôi và các nhà phát triển khác mà tôi đã nói chuyện.

0

Khung không phải là điều ác. ngay cả Java SDK cũng là một khung công tác.

Những gì họ có thể chiến đấu là tăng sinh khung. Bạn không nên mang theo một khuôn khổ cho một dự án chỉ cho cú đá của nó, nó sẽ mang lại giá trị phù hợp trong một thời gian hợp lý. Mỗi khung công tác đòi hỏi một đường cong học tập, nhưng nên thưởng cho bạn với năng suất và tính năng tăng lên sau này.

Nếu bạn gặp khó khăn với mã khó gỡ lỗi do sử dụng cơ sở dữ liệu không phù hợp, cơ chế bộ nhớ cache phức tạp hoặc vô số lý do khác. Hibernate sẽ thêm giá trị lớn. ngoài đường cong học tập (mất khoảng 1 tháng làm việc thực tế cho tôi) không có bất kỳ cạm bẫy nào, miễn là bạn có ai đó xung quanh để giải thích những điều cơ bản cho bạn.

16

Hibernate có quirks để chắc chắn nhưng đó là bởi vì vấn đề nó đang cố gắng giải quyết là phức tạp. Mỗi khi ai đó phàn nàn về Hibernate tôi nhắc nhở họ về tất cả các mã DAO nhàm chán mà họ sẽ phải duy trì nếu họ không sử dụng nó.

Một vài lời khuyên:

  • Hibernate là không thay thế cho một thiết kế cơ sở dữ liệu tốt. Hibernate lược đồ là OK nhưng bạn sẽ phải tinh chỉnh chúng đôi khi
  • Cuối cùng bạn sẽ phải hiểu làm thế nào Hibernate lười biếng tải các lớp học và làm thế nào mà ảnh hưởng đến mọi thứ. Hibernate sửa đổi bytecode Java và bạn sẽ cần phải nghiên cứu sâu vào các chiều sâu sớm hay muộn nếu chỉ để giải thích tại sao các liên kết đối tượng là null.
  • Sử dụng chú thích nếu bạn có thể.
  • Dành thời gian để tìm hiểu các kỹ thuật điều chỉnh hiệu suất Hibernate, nó sẽ giúp bạn tiết kiệm trong thời gian dài.
+0

Bất kỳ ý kiến ​​nào về Mùa xuân? – magius

+0

"Kỹ thuật điều chỉnh hiệu suất Hibernate" Bạn có bất kỳ tài liệu nào về điều đó không? –

+0

Chỉ cần googled "Hibernate hiệu suất điều chỉnh kỹ thuật" mà trả lại khá một vài lần truy cập. Nhưng vâng, giống như những gì Blade nói, bạn có tài nguyên nào không? – magius

3

Tôi đã thực hiện rất nhiều công đoạn phát triển Spring/Hibernate. Theo thời gian, cách mọi người sử dụng cả hai kết hợp đã thay đổi một chút. Cách tiếp cận ban đầu của HibernateTemplate đã được chứng minh là khó gỡ lỗi vì nó nuốt và kết thúc tốt đẹp các ngoại lệ hữu ích khác; nói chuyện trực tiếp với Hiberante API!

Hãy tiếp tục xem SQL đã tạo (định cấu hình nhật ký phát triển của bạn để hiển thị SQL). Có một lớp trừu tượng cho cơ sở dữ liệu không có nghĩa là bạn không phải suy nghĩ trong SQL nữa; bạn sẽ không nhận được hiệu suất tốt nếu bạn khác.

Xem xét dự án. Tôi đã chọn iBatis trên Hibernate trong một số trường hợp mà chúng tôi đã có yêu cầu nghiêm ngặt về hiệu năng, các lược đồ kế thừa phức tạp hoặc khả năng viết tốt của DBa của SQL.

0

@slim - Tôi đang ở bên bạn một lần nữa sáng nay.

Có vẻ như trường hợp cổ điển là Không được phát minh ở đây Hội chứng. Nếu họ không quan tâm đến mùa xuân, họ nên xem xét các lựa chọn khác thay vì lăn khuôn khổ riêng của họ (cho dù họ thừa nhận làm việc đó hay không). Guice được coi là một khả năng. Ngoài ra picocontainer. Có những người khác ra khỏi đó, tùy thuộc vào những gì bạn cần.

7

Nếu bạn có một cơ sở dữ liệu khá phức tạp, Hibernate có thể không dành cho bạn. Tại nơi làm việc, chúng tôi có một cơ sở dữ liệu khá phức tạp với rất nhiều dữ liệu, và Hibernate không thực sự làm việc cho chúng tôi. Chúng tôi đã bắt đầu sử dụng iBATIS thay thế. Tuy nhiên, tôi biết rất nhiều cửa hàng phát triển người sử dụng Hibernate thành công - và nó làm rất nhiều công việc grunt cho bạn - vì vậy nó có giá trị xem xét.

Mùa xuân là một công cụ tốt nếu bạn biết cách sử dụng nó đúng cách.

Tôi sẽ nói rằng các khung hình chắc chắn là một điều tốt - như những người khác đã chỉ ra, bạn không muốn phát minh lại bánh xe. Spring chứa rất nhiều module sẽ có nghĩa là bạn sẽ không phải viết quá nhiều mã. Đừng chống lại hội chứng "Không phát minh ra ở đây"!

2

Đối với Hibernate: một công cụ rất tốt cho ứng dụng mà đề với một lược đồ cơ sở dữ liệu thay đổi nhanh chóng, một số lượng lớn các bảng, làm rất nhiều hoạt động CRUD đơn giản. Các báo cáo có các truy vấn phức tạp liên quan được xử lý khá ít. Nhưng trong trường hợp này tôi thích trộn trong JDBC hoặc truy vấn gốc. Vì vậy, đối với một câu trả lời ngắn: Tôi nghĩ rằng thời gian học Hibernate là một đầu tư tốt (họ nói rằng nó tuân thủ các tiêu chuẩn EJB3.0 và JPA, cũng vậy, nhưng điều đó không đi vào phương trình khi tôi đánh giá nó cho cá nhân của tôi sử dụng).

Đối với mùa xuân ... see The Bile Blog :)

Hãy nhớ rằng: khuôn khổ không silver bullets, nhưng bạn không nên reinvent the wheel một trong hai.

7

Đây là một điều (tôi có thể nhớ) mà tôi đã trải qua khi tôi ở trong những ngày Hibernate của tôi. Khi bạn xóa (một vài) đối tượng con từ một bộ sưu tập (trong thực thể cha) và sau đó thêm các thực thể mới vào cùng một bộ sưu tập trong một giao dịch mà không xả ở giữa, Hibernate sẽ thực hiện "chèn" trước "xóa". Nếu bảng con có một ràng buộc duy nhất trong một trong các cột của nó và bạn đang mong đợi rằng bạn sẽ không vi phạm nó vì bạn đã xóa một số dữ liệu trước đó (giống như tôi), thì hãy sẵn sàng để thất vọng. Diễn đàn Hibernate gợi ý:

  1. Đó là lỗi thiết kế DB, thiết kế lại;
  2. tuôn ra (hoặc cam kết nếu bạn muốn) giữa các lần xóa và chèn;

Tôi không thể làm cả hai và kết thúc việc chỉnh sửa nguồn Hibernate và biên dịch lại. Đó chỉ là 1 dòng mã. Nhưng nỗ lực để thấy rằng một dòng tương đương với khoảng 27 tách cà phê và 3 đêm không ngủ.

Đây chỉ là một ví dụ về các vấn đề và quirks bạn có thể kết thúc khi sử dụng Hibernate không có chuyên gia thực sự trong nhóm của bạn (chuyên gia: ai đó có kiến ​​thức đầy đủ về triết lý và làm việc nội bộ của Hibernate). Vấn đề của bạn, giải pháp, lít cà phê, và số đêm không ngủ có thể thay đổi. Nhưng bạn hiểu ý rồi đấy.

+0

xả nước không cam kết, nó chỉ đẩy ra những thay đổi bạn đã nêu cho giao dịch cho đến nay. Nó sẽ cam kết nếu bạn có tự động cam kết. –

+0

Một chuyên gia chính xác là những gì chúng tôi không có. Chúng tôi chủ yếu dựa vào internet (thường là google) như một người cố vấn thay thế. Bỏ phiếu cho bạn. – magius

1

Tôi thấy nó thực sự giúp sử dụng các khuôn khổ nổi tiếng như Hibernate vì nó phù hợp với mã của bạn thành một khuôn cụ thể hoặc một cách suy nghĩ. Có nghĩa là, kể từ khi bạn đang sử dụng Hibernate, bạn viết mã một cách nhất định, và hầu hết nếu không phải tất cả các nhà phát triển những người biết Hibernate sẽ có thể làm theo dòng suy nghĩ của bạn khá dễ dàng.

Có một nhược điểm đối với điều này, tất nhiên. Trước khi bạn trở thành một nhà phát triển Hibernate, bạn sẽ thấy rằng bạn đang cố gắng để phù hợp với một hình vuông thành một lỗ tròn. Bạn BIẾT những gì bạn muốn làm, và làm thế nào bạn có nghĩa vụ phải làm điều đó trước khi Hibernate đi vào hình ảnh, nhưng việc tìm cách Hibernate làm nó có thể mất ... khá một chút thời gian.

Tuy nhiên, đối với các công ty thường xuyên thuê tư vấn (cần hiểu nhiều mã nguồn trong một khoảng thời gian ngắn) hoặc nơi các nhà phát triển đăng nhập và thoát thường xuyên, hoặc nơi bạn không muốn đặt cược các nhà phát triển chính của bạn sẽ ở lại mãi mãi và không bao giờ thay đổi công việc - Hibernate và các khung tiêu chuẩn khác là một ý tưởng khá hay mà tôi nghĩ.

/Ace

5

Tôi luôn thấy Hibernate hơi phức tạp và khó học. Nhưng như JPA (Java Persistence API) và EJB (Enterprise Java Beans) 3.0 đã tồn tại trong một thời gian, mọi thứ trở nên dễ dàng hơn nhiều, tôi thích chú thích các lớp của mình để tạo ánh xạ thông qua JavaDoc hoặc XML. Hãy xem support in Hibernate. Tiền thưởng bổ sung là có thể (nhưng không dễ dàng) để thay đổi khung cơ sở dữ liệu sau này nếu cần. Tôi đã sử dụng OpenJPA với kết quả tuyệt vời.

Gần đây tôi đã sử dụng JCR (Kho nội dung Java) ngày càng nhiều. Tôi thích cách mà các mô-đun của tôi có thể chia sẻ một lưu trữ dữ liệu duy nhất và tôi có thể cho phép cấu trúc và các thuộc tính phát triển. Tôi tìm thấy nó dễ dàng hơn nhiều khi làm việc với các nút và các thuộc tính thay vì ánh xạ các đối tượng của tôi tới một cơ sở dữ liệu. Triển khai tốt là Jackrabbit.

Đối với Spring, nó có rất nhiều tính năng tôi thích, nhưng lượng XML cần thiết để cấu hình có nghĩa là tôi sẽ không bao giờ sử dụng nó. Thay vào đó, tôi sử dụng Guice và hoàn toàn thích nó.

Để làm tròn, tôi sẽ cho các nhà phát triển nghi ngờ của bạn cách Hibernate sẽ làm cho cuộc sống của họ dễ dàng hơn. Đối với mùa xuân tôi nghiêm túc sẽ kiểm tra xem Guice là một thay thế khả thi và sau đó cố gắng để hiển thị như thế nào Spring/Guice làm cho phát triển tốt hơn và dễ dàng hơn.

+0

Tôi đồng ý, tôi không phải là người hâm mộ các khung công tác đòi hỏi quá nhiều cấu hình XML. Mặc dù mùa xuân đã được cải thiện rất nhiều theo nghĩa đó, nó vẫn không phải là không có XML. Đây là một trong những lý do tại sao chúng tôi đã khởi chạy dễ dàng để tìm hiểu - với cấu hình gần bằng 0 - khung MVC được xây dựng trên đầu trang của Guice: [geeMVC] (https://github.com/commerceboard/geemvc). Tại sao khi có quá nhiều khung MVC ngoài kia? Hãy xem [động cơ] của chúng tôi (https://github.com/commerceboard/geemvc/wiki/Motivation-Behind-geeMVC) sau khi thêm một động lực khác. – michaeldd

0

Mùa xuân và Hibernate chắc chắn làm cho cuộc sống dễ dàng hơn. Bắt đầu với họ có thể hơi tốn thời gian ngay từ đầu, nhưng bạn chắc chắn sẽ được hưởng lợi từ nó sau này. Bây giờ XML đang được thay thế bằng các chú thích, bạn cũng không cần phải nhập hàng trăm dòng XML.

Bạn có thể muốn xem xét AppFuse để giảm đường cong học tập của bạn: tạo một ứng dụng, nghiên cứu và điều chỉnh nó, và tắt bạn đi.

7

Tải trọng chậm là ứng dụng lớn trong các ứng dụng MVC sử dụng Hibernate cho khuôn khổ kiên trì của chúng. Bạn nạp đối tượng trong bộ điều khiển và chuyển nó vào khung nhìn JSP. Một số hoặc tất cả các thành viên của lớp được proxy và tất cả mọi thứ thổi lên bởi vì bạn Hibernate phiên đã được đóng lại khi bộ điều khiển hoàn thành.

Bạn cần đọc bài viết Open Session in View để hiểu vấn đề và nhận giải pháp. Nếu bạn đang sử dụng Spring, điều này blog article mô tả giải pháp Spring cho phiên mở trong vấn đề xem.

1

Mùa xuân và Hibernate là các khung công việc phức tạp. Nó có thể không phải là một ý tưởng tốt để sử dụng chúng trong các dự án với thời hạn chặt chẽ trong khi bạn vẫn đang cố gắng tìm ra các khuôn khổ.

Lợi ích của khung công tác cơ bản là cố gắng cung cấp nền tảng để cho phép mã nhất quán là sản phẩm. Từ kinh nghiệm, bạn sẽ được tư vấn tốt để các nhà phát triển có kinh nghiệm với các khung công tác thiết lập các thực tiễn tốt nhất.

Tùy thuộc vào thiết kế ứng dụng và/hoặc cơ sở dữ liệu của bạn, bạn cũng cần phải tránh né để đảm bảo rằng các khung công tác không cản trở hiệu suất.

1

Tôi phải đồng ý với nhiều bài đăng trên trang này. Tôi đã sử dụng cả hai, rộng rãi, trong một loạt các cài đặt. Nếu tôi có thể hoàn tác một quyết định thiết kế nó sẽ là đã sử dụng Hibernate. Chúng tôi thực sự đã lập ngân sách cho một bản phát hành ở một trong các sản phẩm của chúng tôi để hoán đổi Hibernate cho iBatis và Spring-JDBC để có cách tiếp cận tốt nhất của tất cả các thế giới. Tôi có thể có một nhà phát triển mới bắt kịp tốc độ sử dụng Spring-JDBC, Spring-MVC, Spring-Ioc và iBatis nhanh hơn nếu tôi chỉ giao nhiệm vụ cho họ với Hibernate.

Hibernate quá phức tạp đối với nhà phát triển KISS này. Và thiên đường giúp bạn với ngủ đông nếu DBA của bạn nhìn thấy SQL được tạo ra mà cơ sở dữ liệu nhìn thấy và gửi lại cho bạn với các phiên bản được tối ưu hóa.

1

Theo tôi, ưu điểm lớn nhất của Spring là nó khuyến khích và cho phép thực hành phát triển tốt hơn, đặc biệt là ghép nối lỏng lẻo, thử nghiệm và nhiều giao diện khác. Hibernate không có Spring có thể thực sự đau đớn, nhưng cả hai đều rất hữu ích.

Trang bị thêm một dự án hiện có cho bất kỳ khung công tác nào sẽ gây đau đớn, nhưng quy trình tái cấu trúc thường có những lợi ích nghiêm trọng cho việc duy trì lâu dài.

1

Câu trả lời hàng đầu đề cập rằng Hibernate không được ghi nhận tài liệu. Tôi đồng ý rằng hướng dẫn tham khảo trực tuyến có thể hoàn chỉnh hơn. Tuy nhiên, một cuốn sách được viết bởi các tác giả của Hibernate, 'Java persistence with Hibernate' là phải đọc cho mọi người dùng Hibernate và rất hoàn chỉnh.

Các vấn đề liên quan