ทางเลือกที่มีน้ำหนักเบาสำหรับ Hibernate? [ปิด]


113

ฉันมีโปรแกรม java ผู้ใช้คนเดียวที่ฉันต้องการจัดเก็บข้อมูลในฐานข้อมูลน้ำหนักเบาเช่น Derby หรือ Sqlite ฉันต้องการใช้เลเยอร์นามธรรมข้อมูลในโปรแกรมของฉัน ดูเหมือนว่าไฮเบอร์เนตจะต้องมีการกำหนดค่าจำนวนมากและเกินความจำเป็นสำหรับสิ่งที่ฉันต้องการ ทางเลือกที่มีน้ำหนักเบาสำหรับไฮเบอร์เนตคืออะไร?


2
คุณสามารถตรวจสอบทางเลือกอื่น ๆ พร้อมกับตัวอย่างการใช้งาน (และตัวอย่างการกำหนดค่าด้วย Spring) ได้ที่นี่: github.com/bwajtr/java-persistence-frameworks-comparison
Břetislav Wajtr

CMobileCom JPA เป็นการใช้งาน JPA ที่มีน้ำหนักเบาสำหรับทั้ง Java และ Android ขนาดประมาณ 380K มันเบาและเร็ว cmobilecom.com
John

คำตอบ:


142

ไฮเบอร์เนตต้องการการกำหนดค่าถัดจากศูนย์หากคุณใช้คำอธิบายประกอบ มันยังสามารถค้นหาถั่วที่แมปอัตโนมัติใน classpath ได้อีกด้วย! ฉันไม่เห็นทางเลือกอื่นจากทั้งความเรียบง่ายและมุมมองด้านพลัง

นอกจากนี้ยังสามารถแสดงตัวเองเป็น JPA ซึ่ง (IMHO) ง่ายกว่า


32
ถัดจากศูนย์ไม่ใช่ศูนย์
njzk2

12
นอกจากนี้ยังต้องการไลบรารีภายนอกจำนวนมากเพื่อพยายามใช้บน Android: P
sherif

4
ฉันพยายามหาทางเลือกอื่นที่ง่ายกว่าสำหรับไฮเบอร์เนต ในโครงการส่วนตัวฉันใช้ MyBatis (ช่างเป็นชื่อที่แย่มาก) มันทำงานได้ดีกว่า Hibernate มาก Hibernate ช่วยประหยัดการเข้ารหัส SQL ได้มากและช่วยในเรื่องความสัมพันธ์ระหว่างแม่ลูก ฉันยังดู ORM สไตล์ ActiveRecord บางส่วนสำหรับ Java ไม่มีใครดูเป็นผู้ใหญ่หรือง่ายไปกว่า Hibernate ฉันจะกลับไปที่ไฮเบอร์เนต
devdanke

56
คำถามไม่เกี่ยวกับทางเลือกใช่หรือไม่?
Łukasz Gruner

8
Hibernate ไม่ใช่ทางเลือกที่มีน้ำหนักเบาสำหรับ Hiberernate
cosbor11

55

ไลบรารีORMLiteของฉันเป็นทางเลือกหนึ่ง รองรับ MySQL, Postgres, Microsoft SQL Server, H2, Derby, HSQLDB และ Sqlite และสามารถขยายไปยังผู้อื่นได้อย่างง่ายดาย ใช้คำอธิบายประกอบเพื่อกำหนดค่าคลาสการสนับสนุน Spring ที่ดีตัวสร้างแบบสอบถามที่ยืดหยุ่น ฯลฯ


OrmLite ดูมีอนาคตจริงๆ! แต่โครงการนี้ยังมีชีวิตอยู่หรือไม่? ไม่มีเวอร์ชันใหม่มานานกว่าหนึ่งปีไม่มีคำตอบในการดึงคำขอ / ปัญหาบน Github
Stefan

3
เวอร์ชัน 5.0 เปิดตัวในเดือนมิถุนายน 2559
Lauri Laanti

เวอร์ชัน 5.1 เผยแพร่เมื่อวันที่ 19/2/2561 แต่เทียบไม่ได้กับ Hibernate เลยและการใช้งานคำอธิบายประกอบ JPA บางอย่างทำงานไม่ถูกต้อง
M-Razavi

"เปรียบได้กับ Hibernate"? พวกเขาทั้งสองเป็น ORM แต่แตกต่างกันอย่างมาก ในแง่ของการใช้งาน JPA โปรดกรอกรายงานข้อบกพร่องหากคุณพบบางสิ่งบางอย่าง @ M-Razavi
สีเทา

31

มันก็ยังคงต้องมีการกำหนดค่า XML แต่มีลักษณะที่MyBatis (เดิม iBatis)


iBatis มีน้ำหนักเบามาก คุณสามารถกำหนดและควบคุม SQL ของคุณกับการแมปวัตถุได้ง่ายขึ้น
Berlin Brown

... ต้องโหวตให้ iBatis แม้ว่าคุณจะคิดว่าไม่ใช่ทางเลือก ORM เนื่องจากไม่ได้พยายามแข่งขันกับผู้ที่ชอบ Hibernate มันเป็นสัตว์ที่แตกต่างกันเล็กน้อย แต่เหมาะกับสิ่งที่คุณกำลังมองหาในแง่ของน้ำหนัก
เวกเตอร์

1
ตอนนี้เหลือMyBatis แล้ว
Vladislav Rastrusny

3
ฉันคิดว่า XML ใน i / MyBatis เป็นข้อได้เปรียบเนื่องจากเก็บแบบสอบถามที่ซับซ้อนในรูปแบบที่สามารถคัดลอกไปยังคอนโซล SQL เพื่อทดสอบได้อย่างง่ายดาย
Peter Tillemans

22

jOOQมาพร้อมกับ DSL ที่คล่องแคล่วจำลอง SQL โดยตรงใน Java เป็นผลข้างเคียงสำหรับเป้าหมายหลักซึ่ง ได้แก่ :

  • การสร้างซอร์สโค้ด
  • รองรับ SQL มาตรฐานอย่างสมบูรณ์รวมถึงคุณสมบัติภาษา SQL เช่น UNIONs, Select ที่ซ้อนกัน, JOIN ทุกประเภท, นามแฝง (เช่นสำหรับการรวมตัวเอง) ฯลฯ
  • รองรับ SQL ที่ไม่ได้มาตรฐานอย่างกว้างขวางรวมถึง UDT ของโพรซีเดอร์ที่เก็บไว้ฟังก์ชันเฉพาะของผู้ขายเป็นต้น

อ่านเกี่ยวกับ jOOQ ในบทความนี้: http://java.dzone.com/announcements/simple-and-intuitive-approachหรือเยี่ยมชมเว็บไซต์โดยตรง: http://www.jooq.org

(ข้อจำกัดความรับผิดชอบฉันทำงานให้กับ บริษัท ที่อยู่เบื้องหลัง jOOQ)


3
jOOQ หิน! เราใช้บริการ ETL ขนาดใหญ่กับมันและไม่มีความสุขไปกว่านี้แล้ว ฉันเคยใช้ iBATIS และ jOOQ ให้ข้อดีแบบเดียวกันทั้งหมดของ SQL ระดับต่ำโดยไม่ต้องรีม XML และไม่มีประเภทความปลอดภัย
สอดแนม

3
ฉันลืมที่จะพูดถึงคุณสมบัติที่ดีที่สุดอย่างหนึ่งของ jOOQ: การสืบค้นที่ซับซ้อนและ / หรือการสร้างแบบไดนามิกสามารถประกอบได้ด้วยวิธีการควบคุมและตรวจสอบโดยคอมไพเลอร์ Java ช่วยให้คุณประหยัดจากฐานข้อมูลข้อผิดพลาดทางไวยากรณ์ที่คลุมเครือทั้งหมดและให้การถดถอยเวลาคอมไพล์ ความครอบคลุมเมื่อสคีมาเปลี่ยนแปลงภายใต้คุณ
สอดแนม

JOOQ นั้นยอดเยี่ยมมาก แต่เห็นได้ชัดว่าตอนนี้ Oracle และ Sybase ไม่ฟรีดังนั้นผู้คนจำนวนมากจึงหลีกเลี่ยงเฟรมเวิร์กนี้และใช้เช่น MyBatis
Makky

@ Makky: ขอบคุณสำหรับคำติชม ฉันหวังว่าคุณจะคำนึงถึงข้อเสนอคุณค่าที่แท้จริงและคุณจะไม่เปลี่ยนไปใช้กรอบงานที่แตกต่างไปจากเดิมโดยสิ้นเชิงเพียงแค่พิจารณาจากความจริงที่ว่าอันนั้นฟรีและอีกอันไม่เป็นเช่นนั้น ค่าใช้จ่ายในการบำรุงรักษาและการย้ายข้อมูลนี้จะก่อให้เกิดซอฟต์แวร์ของคุณเป็นสิ่งต้องห้ามและยังเกินกว่าใบอนุญาตทางการค้าที่สมเหตุสมผล ...
Lukas Eder

15

Apache Commons DBUtilsใช้เวลาส่วนใหญ่จากการเขียนโปรแกรม JDBC ต้องมีการกำหนดค่าเพียงเล็กน้อยและเรียนรู้ได้ง่าย ไม่ใช่เฟรมเวิร์ก ORM (ในลักษณะที่ Hibernate และเฟรมเวิร์กอื่น ๆ ที่กล่าวถึงที่นี่) แต่จะทำการแมปคอลัมน์ SELECT กับฟิลด์สมาชิก Java โดยอัตโนมัติรวมถึงงานการเขียนโปรแกรม JDBC ที่ทำซ้ำ ๆ น้ำหนักเบาอย่างแน่นอน


12

คุณสามารถมีลักษณะที่ออม Ebean - ไม่มีเซสชัน - การโหลดแบบขี้เกียจใช้งานได้ - API ที่ง่ายกว่าในการใช้และเรียนรู้


เข้ากันได้กับ SQLite และ Android หรือไม่
endryha

เพิ่มการรองรับ SQLite แล้ว ฉันยังไม่ได้ลองใช้บน Android
Rob Bygrave

9

คาเยนน์ทำหน้าที่ฉันได้ดี ค่อนข้างง่ายในการทำความเข้าใจและเริ่มต้นใช้งาน ฉันพบว่าส่วนวิศวกรรมย้อนกลับมีเสน่ห์เป็นพิเศษ การกำหนดค่าสามารถทำได้ด้วย GUI


6

ฉันสามารถเสนอ apache empire-db http://incubator.apache.org/empire-db/

Apache Empire-db เป็นส่วนประกอบการคงอยู่ของข้อมูลเชิงสัมพันธ์แบบโอเพนซอร์สซึ่งช่วยให้ผู้ให้บริการฐานข้อมูลนิยามการสืบค้นแบบไดนามิกที่เป็นอิสระตลอดจนการดึงและอัปเดตข้อมูลที่ปลอดภัยและง่ายดาย เมื่อเทียบกับโซลูชันอื่น ๆ ส่วนใหญ่เช่นการใช้งาน Hibernate, TopLink, iBATIS หรือ JPA Empire-db ใช้วิธีการที่แตกต่างกันมากโดยเน้นเป็นพิเศษในเรื่องความปลอดภัยในการรวบรวมเวลาลดความซ้ำซ้อนและเพิ่มประสิทธิภาพการทำงานของนักพัฒนา

ตัวอย่าง:

// Define the query
DBCommand cmd = db.createCommand();
DBColumnExpr EMPLOYEE_FULLNAME= db.EMPLOYEES.LASTNAME.append(", ")
                        .append(db.EMPLOYEES.FIRSTNAME).as("FULL_NAME");
// Select required columns
cmd.select(db.EMPLOYEES.EMPLOYEE_ID, EMPLOYEE_FULLNAME);
cmd.select(db.EMPLOYEES.GENDER, db.EMPLOYEES.PHONE_NUMBER);
cmd.select(db.DEPARTMENTS.NAME.as("DEPARTMENT"));
cmd.select(db.DEPARTMENTS.BUSINESS_UNIT);
// Set Joins
cmd.join(db.EMPLOYEES.DEPARTMENT_ID, db.DEPARTMENTS.DEPARTMENT_ID);
// Set contraints and order
cmd.where(EMP.LASTNAME.length().isGreaterThan(0));
cmd.orderBy(EMP.LASTNAME);;


2

ฉันอาจจะไปปาร์ตี้ช้าไปหน่อย แต่ฉันเปิดตัวActiveJDBC ในปี 2010 ซึ่งเป็นการใช้งาน ORM ของรูปแบบ ActiveRecord นั้นเบากว่า Hibernate ในการอ้างอิงมากกว่า 10 เท่าอย่างน้อยสองเท่าเร็วขึ้นในเวลาทำงานและต้องการการกำหนดค่าเป็นศูนย์ หรือคำอธิบายประกอบ


1

คุณอาจต้องการดูที่ prevayler (บน sourceforge) วิธีการที่ค่อนข้างเบากว่าในการคงอยู่ หรือคุณกำลังคิดจะทำรายงานต่อ DB?




-2

Kiteframework ยังเป็นกรอบ orm ที่เบามาก ให้การทำงานกับฐานข้อมูลเกือบทั้งหมดโดยมีการกำหนดค่าน้อยที่สุด

http://deipakgarg.github.com/Kite-ORM/

การเปิดเผยข้อมูล: ฉันเป็นผู้เขียนโครงการนี้


3
ยินดีต้อนรับสู่ Stack Overflow! ขอบคุณสำหรับการโพสต์คำตอบของคุณ! โปรดอ่านคำถามที่พบบ่อยเกี่ยวกับการส่งเสริมตนเองอย่างละเอียด โปรดทราบว่าคุณจำเป็นต้องโพสต์ข้อจำกัดความรับผิดชอบทุกครั้งที่คุณเชื่อมโยงไปยังไซต์ / ผลิตภัณฑ์ของคุณเอง
Andrew Barber

2
ยังไม่อยู่ในระหว่างการพัฒนาไม่มีรุ่นปัจจุบันใหม่จากผู้เขียนคาดว่าจะวางจำหน่ายล่าสุดในปี 2555
บารุน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.