Bạn sẽ nghĩ gì về một công cụ kiên trì Java mới, đó không thực sự là ORM? [đóng cửa]


12

Sự bền bỉ trong Java

Trong những năm qua, tôi đã thu thập kinh nghiệm trong lĩnh vực trừu tượng hóa bền bỉ trong Java, sử dụng các khái niệm như EJB 2.0, Hibernate, JPA và những người trồng tại nhà. Họ dường như có một đường cong học tập dốc và rất phức tạp. Ngoài ra, là một fan hâm mộ lớn của SQL, tôi cũng nghĩ rằng nhiều mô hình trừu tượng cung cấp quá nhiều sự trừu tượng hóa đối với SQL, tạo ra các khái niệm như "tiêu chí", "vị ngữ", "hạn chế" là những khái niệm rất tốt, nhưng không phải là SQL.

Ý tưởng chung về sự trừu tượng hóa bền bỉ trong Java dường như được dựa trên mô hình quan hệ đối tượng, trong đó RDBMS bằng cách nào đó phù hợp với thế giới OO. Cuộc tranh luận ORM luôn luôn là một vấn đề tình cảm, vì dường như không tồn tại một giải pháp duy nhất phù hợp với tất cả mọi người - nếu một giải pháp như vậy thậm chí có thể tồn tại.

JOOQ

Sở thích cá nhân của tôi về cách tránh các vấn đề liên quan đến ORM là gắn bó với thế giới quan hệ. Bây giờ việc lựa chọn mô hình mô hình dữ liệu không phải là chủ đề thảo luận vì đó là sở thích cá nhân hoặc vấn đề mô hình dữ liệu nào phù hợp nhất với một vấn đề cụ thể. Cuộc thảo luận tôi muốn bắt đầu là xung quanh công cụ kiên trì của riêng tôi được gọi là jOOQ . Tôi đã thiết kế jOOQ để cung cấp hầu hết các lợi thế của các công cụ kiên trì hiện đại có:

  • Một ngôn ngữ cụ thể miền dựa trên SQL
  • Tạo mã nguồn ánh xạ lược đồ cơ sở dữ liệu cơ bản sang Java
  • Hỗ trợ nhiều RDBMS

Thêm một số tính năng mà ít công cụ kiên trì hiện đại có (sửa tôi nếu tôi sai):

  • Hỗ trợ SQL phức tạp - các hiệp hội, các lựa chọn lồng nhau, tự tham gia, bí danh, mệnh đề trường hợp, biểu thức số học
  • Hỗ trợ SQL không chuẩn - thủ tục được lưu trữ, UDT's, ENUMS, hàm gốc, hàm phân tích

Vui lòng xem xét trang tài liệu để biết thêm chi tiết: http://www.jooq.org/learn.php . Bạn sẽ thấy rằng một cách tiếp cận tương tự được triển khai trong Linq cho C #, mặc dù Linq không được thiết kế riêng cho SQL.

Câu hỏi

Bây giờ, khi nói rằng tôi là một fan hâm mộ lớn của SQL, tôi tự hỏi liệu các nhà phát triển khác sẽ chia sẻ sự nhiệt tình của tôi đối với jOOQ (hay Linq). Đây có phải là cách tiếp cận trừu tượng bền bỉ? Những lợi thế / bất lợi bạn có thể thấy là gì? Làm thế nào tôi có thể cải thiện jOOQ, và những gì còn thiếu trong quan điểm của bạn? Tôi đã sai ở đâu, về mặt khái niệm hay thực tế?

Câu trả lời quan trọng nhưng mang tính xây dựng được đánh giá cao

Tôi hiểu rằng cuộc tranh luận là một cuộc tình cảm. Có rất nhiều công cụ tuyệt vời hiện có làm những điều tương tự. Những gì tôi quan tâm là phản hồi quan trọng nhưng mang tính xây dựng, dựa trên kinh nghiệm hoặc bài viết của riêng bạn mà bạn có thể đã đọc.


Nó có xử lý các giao dịch?
Armand

@ Alison: Không, đó chỉ là về SQL. Xử lý giao dịch là một công việc rất phức tạp mà tôi nghĩ rằng nhiều công cụ / khung khác (bao gồm EJB2 / 3) sẽ xử lý tốt hơn jOOQ
Lukas Eder

Tôi thực sự muốn đề xuất một trường hợp sử dụng rất chắc chắn và đáng ghét trong đó bạn cho thấy cách tiếp cận của mình là tuyệt vời để giải quyết nó.

Cũng lưu ý rằng chỉnh sửa NÀY nặng nề sẽ khiến câu trả lời ít nhiều không liên quan và do đó không thể sử dụng được cho các độc giả trong tương lai. Thay vào đó, hãy hỏi một câu hỏi mới và tốt hơn.

Xin chào Thorbjorn. Bạn có nghĩa là một trường hợp sử dụng khác với trường hợp được hiển thị trên trang ví dụ? Hoặc bạn muốn xem một số ví dụ trong chính câu hỏi? Về chỉnh sửa: nói chung bạn đúng. Tuy nhiên, trong trường hợp này, tôi nghĩ rằng hai câu trả lời mà tôi đã nhận được cho đến nay sẽ có phần giống nhau ...
Lukas Eder

Câu trả lời:


5

Tôi nghĩ rằng bạn đang đi đúng hướng và nên tiếp tục với giải pháp của bạn. Một số lời chỉ trích trước đây quá khắc nghiệt, nhưng một số điểm hợp lệ được đưa ra.

Tôi cũng đã tìm kiếm lâu dài và chăm chỉ cho một giải pháp ORM đầy đủ tính năng phù hợp với nhu cầu của tôi, nhưng mọi giải pháp tôi xem xét đều xuất hiện ngắn. Mỗi cái đều có ưu và nhược điểm nhưng không ai thực sự làm mọi thứ tôi muốn. Tôi đồng ý với những lời chỉ trích của bạn về các giải pháp này - cụ thể là chúng thường phức tạp và có đường cong học tập dốc.

Ứng cử viên hàng đầu sẽ phải là tiêu chuẩn thực tế, Hibernate. Nó là đầy đủ tính năng, mạnh mẽ và được thử nghiệm tốt. Tôi tôn trọng nó và đánh giá cao nó cho những gì nó là. Bây giờ, có nguy cơ xúc phạm một nửa cộng đồng lập trình, tôi cũng phải nói rằng đó là một đoạn mã không phức tạp và phức tạp. Tôi đã dành một khoảng thời gian khá dài để chọc vào ruột của nó, cố gắng gỡ lỗi và hiểu nó, và tôi không ấn tượng với những gì tôi thấy. Có nói rằng, tôi vẫn sẽ giới thiệu nó như là điểm khởi đầu cho bất cứ ai tìm kiếm một ORM tốt. Nó vượt trội ở CRUD đơn giản, nhưng tôi sẽ không sử dụng nó cho các truy vấn hàng loạt hiệu suất, chẳng hạn như khai thác dữ liệu hoặc crunching số.

Thật không may, ứng dụng của tôi là nhiều loại crunching số (mặc dù có một số CRUD quá), vì vậy tôi quyết định tự cuộn. Ngay từ đầu tôi đã biết rằng nó sẽ ngang bằng so với các giải pháp khác ngoài kia, nhưng nó sẽ đủ tốt và mang lại cho tôi hiệu suất tôi cần. Bây giờ đây là phần thực sự tuyệt vời: nó trông rất giống giải pháp của bạn!

Đây là những gì tôi nghĩ rằng bạn đã làm đúng nhất: Bạn tuyên bố niềm tin cơ bản của bạn như một loại tuyên bố sứ mệnh, và những niềm tin đó là chính xác. Rõ ràng tôi cũng đã dành một khoảng thời gian hợp lý để suy nghĩ về vấn đề này và đó là một vấn đề khó giải quyết. Nhưng khi thời gian trôi qua, tôi nghĩ cộng đồng lập trình hiểu rõ hơn về nó và chúng tôi sẽ tạo ra các giải pháp tốt hơn. Kudos cho tất cả những nỗ lực trước đây (đặc biệt là Hibernate), nhưng tôi nghĩ chúng ta có thể làm tốt hơn.

Giải pháp của bạn tốt hơn để tinh chỉnh vấn đề, nhưng nó chỉ giải quyết được một phần của nó. Tôi nghĩ rằng một cách tiếp cận nhiều lớp có thể cho chúng ta mọi thứ chúng ta muốn. Những gì bạn đã đưa ra / IMO, là lớp nền tảng. Như bạn đã đề xuất, tôi nghĩ rằng lớp này được tạo tự động tốt nhất dựa trên lược đồ cơ sở dữ liệu. Nó phải là một mô hình đối tượng quan hệ rất đơn giản, ánh xạ trực tiếp vào cơ sở dữ liệu và không còn nữa. Bạn đúng rằng dữ liệu tồn tại lâu hơn nhiều so với mã, vì vậy ở cấp độ này, dữ liệu sẽ điều khiển mã chứ không phải ngược lại. Nó sẽ hỗ trợ CRUD cũng như truy vấn hàng loạt hiệu suất. Tôi có thể sẽ thực hiện một số loại bộ đệm L1 ở lớp này.

Tuy nhiên, điều mà các giải pháp ORM khác vượt trội là khả năng xác định các đối tượng của bạn theo cách không phụ thuộc quá nhiều vào cấu trúc thực tế của cơ sở dữ liệu cơ bản. Đối với chức năng này, tôi sẽ tạo một lớp khác. Do sự cần thiết, lớp này trở nên trừu tượng hơn, hy vọng đơn giản hơn (với chi phí mất chức năng) và xây dựng trên lớp trước. Nó có thể sử dụng bộ đệm L2.

Tôi sẵn sàng có nhiều lớp hơn, nhưng điểm mấu chốt đối với tôi là bằng cách cung cấp nhiều điểm vào thư viện, bạn có thể đáp ứng mọi nhu cầu. Đối với những người muốn một giải pháp CRUD đơn giản ánh xạ trực tiếp đến các đối tượng mà họ chọn, họ có thể xây dựng trên lớp trên cùng. Đối với những người tìm kiếm thứ gì đó mạnh mẽ và hiệu quả hơn nhưng sẵn sàng gánh chịu sự phức tạp thêm vào, họ có thể cắm vào lớp dưới. Tôi sẽ không tạo một ngôn ngữ truy vấn đặc biệt, nhưng thay vào đó sẽ hiển thị đối tượng trình tạo truy vấn của bạn cho mục đích này. Và vì mã được xếp lớp, chức năng đó tự nhiên tồn tại mà không cần thông qua đặc biệt.

Tôi nghĩ rằng bạn có một sự hiểu biết về không gian và không phát minh lại bánh xe mà thay vào đó đã đạt được một phân khúc hơi khác. Và thẳng thắn, đây là một bánh xe có thể sử dụng cải tiến nào. Bạn phải đối mặt với một trận chiến khó khăn chống lại các cường quốc trong quá khứ, nhưng nếu giải pháp của bạn tốt, và tôi nghĩ rằng nó đang đi theo hướng đó, thì nó sẽ trở nên phổ biến trên giá trị của chính nó.


Xin chào Dale, cảm ơn bạn đã khuyến khích của bạn! Tôi thích phrasing của bạn về các lớp và jOOQ nằm ở lớp thấp nhất với khả năng trừu tượng hơn nữa có thể ở trên jOOQ. Đó là điều tôi muốn giải quyết khi tôi có đủ động lực với jOOQ. Giao diện với JPA và / hoặc Hibernate rõ ràng sẽ nằm trong lộ trình. Như bạn đã nói, các công cụ này vượt trội về tính đơn giản thông qua tính trừu tượng và có nhiều tính năng mà tôi không muốn trong lớp của mình: giao dịch, phiên, bộ đệm L2, v.v. PS: Là giải pháp của riêng bạn trong phạm vi công cộng? Tôi sẽ rất quan tâm!
Lukas Eder

8

"Có rất nhiều viên đạn ma thuật ngoài kia, và không thiếu những nhà phát triển ngây thơ."

Không có ý xúc phạm, có vẻ như bạn hoàn toàn không hiểu những gì đã được thực hiện trong không gian này và do đó đang phát minh lại một số bánh xe - kinh nghiệm sẽ cho chúng ta biết tất cả những bánh xe bạn phát minh ra, trong khi gọn gàng và vui nhộn, dường như không giống như tốt hoặc hữu ích như các bánh xe tinh tế độc đáo đã có sẵn.


1
Cảm ơn phản hồi của bạn! Bạn đã có một cái nhìn sâu hơn về thư viện của tôi? Tôi chính xác cố gắng "từ bỏ chữ O" như thế nào bài viết của bạn gọi nó. jOOQ muốn các nhà phát triển viết SQL, không phải mã OR-Mapped. Tôi cố gắng để đạt được những gì Linq làm cho .NET mà không thể viết lại trình biên dịch Java. Xin chúc mừng Microsoft cho Linq! Và tôi dám nói rằng tôi không ngây thơ, bởi vì tôi đã tạo ra jOOQ sau khi tôi không hài lòng với EJB 2.0 (cách đây khá lâu), cũng như với Hibernate. Chính xác cho những lý do bạn chỉ ra trong bài viết của bạn. Tôi đã thử những gì đã được thực hiện và nó không phù hợp với nhu cầu của tôi.
Lukas Eder

jOOQ muốn các nhà phát triển sử dụng API giống như Tiêu chí của bạn. Đó không phải là SQL. Đó là một cách để tạo SQL mà trong thực tế thì xấu hơn và phức tạp hơn SQL với rất ít lợi ích thực sự nếu có. "q.addCompareCondition (TAuthor.YEAR_OF_BIRTH, 1920, Bộ so sánh.GREATER);" Tôi thấy không có gì thực sự khác biệt so với bất kỳ công cụ tạo lớp nào trên mỗi bảng. Điều đó có nghĩa là, như tôi đã nói, có một xác suất gần như chắc chắn rằng một cái tốt hơn đã tồn tại. Các trường chuỗi được tạo mẫu thậm chí không đến gần với những gì biểu thức lambda cho phép.
quentin-starin

1
Tôi cảm thấy hơi khó khăn để hiểu động cơ đằng sau câu trả lời / nhận xét của bạn. Tôi vẫn nghĩ rằng bạn đã không có cái nhìn thấu đáo về các ví dụ tôi cung cấp (bạn đã trích dẫn ví dụ đầu tiên) và so sánh của bạn với các sản phẩm cạnh tranh có vẻ hơi mơ hồ đối với tôi. Quan điểm của câu hỏi của tôi là nhận được phản hồi mang tính xây dựng, và tôi sẽ đánh giá cao điều đó. Bạn đề cập đến "công cụ tốt hơn" và "biểu thức lambda". Bạn có thể vui lòng giải thích? Làm thế nào để jOOQ so sánh với các công cụ bạn đã đề cập? Các biểu thức lambda được triển khai trong Java 6 như thế nào - trước khi Oracle có thể thêm chúng vào Java 8? Cảm ơn một lần nữa
Lukas Eder

2

Một kịch bản sẽ làm cho loại API này phù hợp là khi bạn cần một trình xây dựng SQL không biết cơ sở dữ liệu mà hầu hết các ORM không cho phép bạn có. Một tình huống lớn mà tôi cần nó là tạo Báo cáo. Tôi đã cần xây dựng SQL theo cách hướng đối tượng và sẽ chạy sql này trên các cơ sở dữ liệu khác nhau để thử nghiệm. Hibernate và các ORM khác phụ thuộc rất nhiều vào cấu hình, do đó hạn chế xây dựng sql của tôi sao cho tôi không thể kết hợp bảng nơi liên kết không tồn tại trong xml. Vì mọi liên kết đều có thể có trong Mô-đun Báo cáo mà tôi đang phát triển, tôi đã tìm kiếm thứ gì đó khác biệt. Sau đó tôi tình cờ gặp JOOQ. Nó chỉ giải quyết vấn đề của tôi. Tôi chỉ cần một quyền truy cập chỉ đọc, không bao giờ gặp phải các vấn đề gỡ lỗi đau đớn như trong chế độ ngủ đông.

Tôi thực sự có kế hoạch phát triển một cách khác để mô hình hóa dữ liệu thay vì cách POJO phổ biến và sử dụng JOOQ làm một trong những nền tảng là một lớp để xây dựng SQL. Vì vậy, trên JOOQ, tôi đang lên kế hoạch tạo ra một cách linh hoạt hơn để mô hình hóa dữ liệu / thực thể bằng cách sử dụng HashMaps. Thiết kế của tôi sẽ giúp tích hợp mặt trước và thiết kế phụ trợ dễ dàng hơn trong một điểm vào, mặc dù tôi sẽ sử dụng các lớp khác nhau để hoàn thành khung, giống như những gì các ý kiến ​​trên đã nói. JOOQ sẽ thực sự đóng một vai trò rất tốt như trong dự án của riêng tôi, nó đóng vai trò là một trong những nền tảng hoặc trụ cột.

Vì vậy, theo kịp các lukas công việc tốt!


1

Nếu tôi hiểu chính xác công cụ của bạn, nó sẽ ánh xạ các Đối tượng trực tiếp vào khung SQL khái niệm thay vì ánh xạ Đối tượng thực hiện một số ánh xạ tới chức năng SQL (ORM), gần giống như một bản tóm tắt ORM-- để kiểm soát geeky lớn hơn để bạn có thể sử dụng nhiều tính năng SQL hơn ORM thường không cung cấp cho bạn?

Không chắc chắn vấn đề bạn đang cố gắng giải quyết. Vì công cụ của bạn yêu cầu kiến ​​thức chuyên sâu về SQL, mọi người sẽ không sử dụng SQL chứ? Đây có phải là mã keo bạn đang cố gắng để thoát khỏi? Xác thực tốt hơn các truy vấn SQL thông qua mô hình API thay vì các chuỗi đơn giản?

Tôi phải thừa nhận rằng các ví dụ JOOQ của bạn trông giống như các phiên bản LISP của SQL. Không phải đó là một điều xấu :) và tôi thấy một số nội dung nâng cao rất thú vị, nhưng những lợi thế bạn liệt kê dần biến mất khi bạn ngày càng tiến bộ hơn (cấu hình nhiều hơn, ít trừu tượng hơn, ăn sâu hơn vào SQL bên trong của SQL cụ thể động cơ, v.v.)

Một gợi ý tôi muốn thấy rằng tôi bỏ lỡ trong hầu hết các ORM là một khung có thể xử lý các Đối tượng theo cách không liên quan, dịch các tương tác của Đối tượng thành bất kỳ phụ trợ nào có thể (SQL, NoQuery, Bản đồ chủ đề, RDF, v.v. .) yêu cầu bộ nhớ đệm của Mô hình được sử dụng thay vì các chi tiết cụ thể về tương tác, phương ngữ và tư duy quan hệ SQL.

IMHO, tất nhiên. :)


Xin chào, cảm ơn phản hồi của bạn. Bạn đã làm đúng. Như qstarin đã nói, tôi cố gắng loại bỏ "O" khỏi ORM và giữ mối quan hệ. Tại sao không phải là SQL đơn giản? Ý bạn là JDBC? Bạn đã bao giờ truy vấn cơ sở dữ liệu của mình với 5 lựa chọn lồng nhau và một số phép nối, hàm phân tích với JDBC chưa? Lỗi cú pháp, không khớp ràng buộc, v.v. Thật không may, jOOQ có thể là công cụ phù hợp với bạn, vì không có khả năng ánh xạ BẤT K model mô hình nào vào các đối tượng. Và tôi không muốn điều đó. JOOQ NÊN quan hệ. Đối với những nhà phát triển thích cách suy nghĩ đó. Đối với người khác, tôi khuyên dùng JPA .. Hoặc Linq nếu bạn đang làm .NET
Lukas Eder
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.