วิธีเลือกกลยุทธ์การสร้างรหัสเมื่อใช้ JPA และ Hibernate


102

ฉันกำลังอ่านหัวข้อการสร้างรหัสของคู่มืออ้างอิง Hibernate และ "java persistence with Hibernate"

มีตัวเลือกมากมายสำหรับ Hibernate และ JPA รวมกัน

ฉันกำลังมองหาเอกสารเพิ่มเติมเกี่ยวกับวิธีเลือกกลยุทธ์การสร้างรหัสเฉพาะ

ฉันยังมองหาจุดให้ทิป

ตัวอย่างเช่นกลยุทธ์ไฮโลคาดว่าจะลดการทะเลาะวิวาท ฉันสมมติว่าต้องมีการแลกเปลี่ยนที่เกี่ยวข้องกับตัวเลือกนี้

ฉันต้องการได้รับการศึกษาเกี่ยวกับการแลกเปลี่ยน

มีวรรณกรรมหรือไม่

คำตอบ:


92

หมอ APIมีความชัดเจนมากเกี่ยวกับเรื่องนี้

เครื่องกำเนิดไฟฟ้าทั้งหมดใช้อินเตอร์เฟส org.hibernate.id.IdentifierGenerator นี่คืออินเทอร์เฟซที่เรียบง่ายมาก แอปพลิเคชันบางตัวสามารถเลือกที่จะให้การใช้งานเฉพาะของตนเองได้อย่างไรก็ตาม Hibernate มีการใช้งานในตัวที่หลากหลาย ชื่อทางลัดสำหรับเครื่องกำเนิดไฟฟ้าในตัวมีดังนี้:

เพิ่มขึ้น

สร้างตัวระบุประเภท long สั้นหรือ int ที่ไม่ซ้ำกันเฉพาะเมื่อไม่มีกระบวนการอื่นแทรกข้อมูลลงในตารางเดียวกัน ห้ามใช้ในคลัสเตอร์

เอกลักษณ์

รองรับคอลัมน์ข้อมูลประจำตัวใน DB2, MySQL, MS SQL Server, Sybase และ HypersonicSQL ตัวระบุที่ส่งคืนเป็นประเภท long สั้นหรือ int

ลำดับ

ใช้ลำดับใน DB2, PostgreSQL, Oracle, SAP DB, McKoi หรือเครื่องกำเนิดไฟฟ้าใน Interbase ตัวระบุที่ส่งคืนเป็นประเภท long สั้นหรือ int

ไฮโล

ใช้อัลกอริทึม hi / lo เพื่อสร้างตัวระบุประเภท long, short หรือ int ได้อย่างมีประสิทธิภาพโดยกำหนดตารางและคอลัมน์ (โดยค่าเริ่มต้น hibernate_unique_key และ next_hi ตามลำดับ) เป็นแหล่งที่มาของค่า hi อัลกอริทึม hi / lo สร้างตัวระบุที่ไม่ซ้ำกันสำหรับฐานข้อมูลเฉพาะเท่านั้น

Seqhilo

ใช้อัลกอริทึม hi / lo เพื่อสร้างตัวระบุประเภท long, short หรือ int อย่างมีประสิทธิภาพโดยกำหนดลำดับฐานข้อมูลที่มีชื่อ

uuid

ใช้อัลกอริทึม UUID 128 บิตเพื่อสร้างตัวระบุของสตริงประเภทที่ไม่ซ้ำกันภายในเครือข่าย (ใช้ที่อยู่ IP) UUID ถูกเข้ารหัสเป็นสตริงที่มีความยาว 32 หลักฐานสิบหก

แนวทาง

ใช้สตริง GUID ที่สร้างจากฐานข้อมูลบน MS SQL Server และ MySQL

พื้นเมือง

เลือกตัวตนลำดับหรือไฮโลขึ้นอยู่กับความสามารถของฐานข้อมูลพื้นฐาน

ที่ได้รับมอบหมาย

ให้แอปพลิเคชันกำหนดตัวระบุให้กับวัตถุก่อนที่จะเรียกบันทึก () นี่เป็นกลยุทธ์เริ่มต้นหากไม่มีการระบุองค์ประกอบ

เลือก

ดึงคีย์หลักที่กำหนดโดยทริกเกอร์ฐานข้อมูลโดยการเลือกแถวตามคีย์ที่ไม่ซ้ำกันและดึงค่าคีย์หลัก

ต่างประเทศ

ใช้ตัวระบุของวัตถุอื่นที่เกี่ยวข้อง โดยปกติจะใช้ร่วมกับการเชื่อมโยงคีย์หลัก

ลำดับเอกลักษณ์

กลยุทธ์การสร้างลำดับแบบพิเศษที่ใช้ลำดับฐานข้อมูลสำหรับการสร้างค่าจริง แต่รวมสิ่งนี้เข้ากับ JDBC3 getGeneratedKeys เพื่อส่งคืนค่าตัวระบุที่สร้างขึ้นเป็นส่วนหนึ่งของการดำเนินการคำสั่งแทรก กลยุทธ์นี้รองรับเฉพาะไดรเวอร์ Oracle 10g ที่กำหนดเป้าหมายสำหรับ JDK 1.4 ข้อคิดเห็นเกี่ยวกับคำสั่งแทรกเหล่านี้ถูกปิดใช้งานเนื่องจากข้อบกพร่องในไดรเวอร์ Oracle

หากคุณกำลังสร้างแอปพลิเคชั่นง่ายๆที่มีผู้ใช้งานพร้อมกันไม่มากคุณสามารถไปที่การเพิ่มตัวตนไฮโลเป็นต้นซึ่งง่ายต่อการกำหนดค่าและไม่จำเป็นต้องมีการเข้ารหัสในฐานข้อมูลมากนัก

คุณควรเลือกลำดับหรือแนวทางขึ้นอยู่กับฐานข้อมูลของคุณ สิ่งเหล่านี้ปลอดภัยและดีกว่าเนื่องจากการidสร้างจะเกิดขึ้นภายในฐานข้อมูล

อัปเดต: เมื่อเร็ว ๆ นี้เรามีปัญหาเกี่ยวกับความคิดที่ซึ่งประเภทดั้งเดิม (int) ได้รับการแก้ไขโดยใช้ประเภท warapper (จำนวนเต็ม) แทน


ขอบคุณมากสำหรับการตอบกลับของคุณ ฉันได้ดูเอกสารแล้ว อย่างไรก็ตามฉันกำลังมองหาว่าทำไมผู้คนถึงใช้บางอย่างเช่นไฮโลและเซคฮิโล เมื่อไหร่ที่เราเลือก อะไรคือกรณีการใช้งานสำหรับการเลือก

เมื่อมีบางสิ่งที่ตรงไปตรงมาเป็นลำดับหรือแนวทางสิ่งที่อาจทำให้นักพัฒนาต้องเลือกหนทางอื่น

1
ฉันได้อัปเดตคำตอบของฉันแล้ว การเพิ่มขึ้นจริงตัวตนไฮโลและอื่น ๆ นั้นง่ายกว่า แต่ไม่เหมาะสำหรับการใช้งานระดับองค์กร การรักษาตัวเลือกทั้งหมดไม่ใช่ปัญหา แต่ให้แน่ใจว่าคุณใช้ตัวเลือกที่เหมาะสมที่สุดสำหรับคุณ!
ManuPK

ใช่. จนถึงตอนนี้ฉันไม่มีสิทธิ์โหวตเพิ่มหรือยอมรับ

ฉันกำลังดูรายละเอียดเพิ่มเติมหากคุณมีเวลาโปรดแจ้งให้เราทราบ

45

โดยทั่วไปคุณมีทางเลือกหลักสองทาง:

  • คุณสามารถสร้างตัวระบุได้ด้วยตนเองซึ่งในกรณีนี้คุณสามารถใช้ตัวระบุที่กำหนดได้
  • คุณสามารถใช้@GeneratedValueคำอธิบายประกอบและไฮเบอร์เนตจะกำหนดตัวระบุให้คุณ

สำหรับตัวระบุที่สร้างขึ้นคุณมีสองตัวเลือก:

  • ตัวระบุ UUID
  • ตัวระบุตัวเลข

สำหรับตัวระบุตัวเลขคุณมีสามตัวเลือก :

  • IDENTITY
  • ลำดับ
  • ตาราง

อัตลักษณ์เป็นเพียงทางเลือกที่ดีเมื่อคุณไม่สามารถใช้ลำดับ (เช่น MySQL) เพราะมันจะปิดใช้งานการปรับปรุงชุด JDBC

ลำดับเป็นตัวเลือกที่ต้องการโดยเฉพาะอย่างยิ่งเมื่อใช้กับเพิ่มประสิทธิภาพระบุเช่นpooled หรือ pooled-Lo

ควรหลีกเลี่ยง TABLE โดยเสียค่าใช้จ่ายใด ๆเนื่องจากใช้ธุรกรรมแยกต่างหากเพื่อดึงตัวระบุและการล็อกระดับแถวซึ่งมีขนาดไม่ดี


20


เมื่อไม่นานมานี้ฉันได้เขียนบทความโดยละเอียดเกี่ยวกับ Hibernate key generator: http://blog.eyallupu.com/2011/01/hibernatejpa-identity-generators.html

การเลือกเครื่องกำเนิดไฟฟ้าที่ถูกต้องเป็นงานที่ซับซ้อน แต่สิ่งสำคัญคือต้องพยายามทำให้ถูกต้องโดยเร็วที่สุดการย้ายข้อมูลล่าช้าอาจเป็นฝันร้าย

หัวข้อเล็กน้อย แต่เป็นโอกาสที่ดีที่จะเพิ่มประเด็นที่มักถูกมองข้ามซึ่งเป็นการแชร์คีย์ระหว่างแอปพลิเคชัน (ผ่าน API) โดยส่วนตัวแล้วฉันชอบคีย์ตัวแทนเสมอและถ้าฉันต้องการสื่อสารออบเจ็กต์ของฉันกับระบบอื่นฉันจะไม่เปิดเผยคีย์ของฉัน (แม้ว่าจะเป็นคีย์ตัวแทนก็ตาม) - ฉันใช้ 'คีย์ภายนอก' เพิ่มเติม ในฐานะที่ปรึกษาฉันได้เห็นการผสานรวมระบบที่ 'ยอดเยี่ยม' มากกว่าหนึ่งครั้งโดยใช้อ็อบเจ็กต์คีย์ (วิธี 'มันอยู่ตรงนั้นเรามาใช้มัน') เพียงเพื่อค้นหาหนึ่งหรือสองปีต่อมาว่าด้านหนึ่งมีปัญหากับช่วงคีย์หรือบางสิ่งบางอย่าง ชนิดที่ต้องมีการโอนย้ายระบบอย่างละเอียดโดยเปิดเผยคีย์ภายใน การเปิดเผยคีย์ของคุณหมายถึงการเปิดเผยลักษณะพื้นฐานของโค้ดของคุณต่อข้อ จำกัด ภายนอกที่ไม่ควรเปิดเผยจริงๆ


2

ฉันพบว่าการบรรยายนี้มีค่ามากhttps://vimeo.com/190275665ในจุดที่ 3 มันสรุปเครื่องกำเนิดไฟฟ้าเหล่านี้และยังให้การวิเคราะห์ประสิทธิภาพและแนวทางหนึ่งเมื่อคุณใช้แต่ละอัน


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