เราทุกคนรู้ถึงพฤติกรรมเริ่มต้นของ Hibernate เมื่อใช้@SequenceGenerator
- มันจะเพิ่มลำดับฐานข้อมูลจริงทีละค่านี้คูณด้วย 50 (ค่าเริ่มต้นallocationSize
) - จากนั้นใช้ค่านี้เป็น ID เอนทิตี
นี่เป็นพฤติกรรมที่ไม่ถูกต้องและขัดแย้งกับข้อกำหนดที่ระบุว่า:
จัดสรรขนาด - (ไม่บังคับ) จำนวนเงินที่จะเพิ่มขึ้นเมื่อจัดสรรหมายเลขลำดับจากลำดับ
เพื่อความชัดเจน: ฉันไม่กังวลเกี่ยวกับช่องว่างระหว่าง ID ที่สร้างขึ้น
ฉันสนใจ ID ที่ไม่สอดคล้องกับลำดับฐานข้อมูลพื้นฐาน ตัวอย่างเช่น: แอปพลิเคชันอื่น ๆ (เช่นใช้ JDBC ธรรมดา) อาจต้องการแทรกแถวใหม่ภายใต้ ID ที่ได้รับจากลำดับ - แต่ค่าเหล่านั้นทั้งหมดอาจถูกใช้โดย Hibernate! ความบ้าคลั่ง
มีใครทราบวิธีแก้ปัญหานี้allocationSize=1
บ้างไหม(โดยไม่ต้องตั้งค่าและทำให้ประสิทธิภาพลดลง)
แก้ไข:
เพื่อให้ทุกอย่างชัดเจน ถ้าระเบียนสุดท้ายแทรกมี ID = 1
ค่าใช้แล้ว HB 51, 52, 53...
สำหรับองค์กรใหม่ แต่ในเวลาเดียวกัน: 2
ค่าลำดับในฐานข้อมูลของจะถูกตั้งค่า ซึ่งสามารถนำไปสู่ข้อผิดพลาดได้อย่างง่ายดายเมื่อแอปพลิเคชันอื่นกำลังใช้ลำดับนั้น
ในทางกลับกัน: ข้อกำหนดระบุว่า (ในความเข้าใจของฉัน) ลำดับฐานข้อมูลควรถูกตั้งค่าเป็น51
และในระหว่างนี้ HB ควรใช้ค่าจากช่วง 2, 3 ... 50
UPDATE:
สตีฟในฐานะ Ebersole ระบุไว้ด้านล่าง: พฤติกรรมที่อธิบายไว้โดยฉัน (และยังใช้งานง่ายที่สุดสำหรับอีกหลายคน) hibernate.id.new_generator_mappings=true
สามารถเปิดใช้งานโดยการตั้งค่า
ขอบคุณทุกท่าน.
อัปเดต 2:
สำหรับผู้อ่านในอนาคตคุณจะพบตัวอย่างการใช้งานด้านล่าง
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
@SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS")
private Long id;
}
persistence.xml
<persistence-unit name="testPU">
<properties>
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>
save
ต้องการค้นหาฐานข้อมูลสำหรับค่าถัดไปของลำดับ
SequenceGenerator
Hibernate จะค้นหาฐานข้อมูลก็ต่อเมื่อจำนวน ID ที่ระบุโดยallocationsize
หมด หากคุณตั้งค่าไว้allocationSize = 1
นั่นคือเหตุผลที่ไฮเบอร์เนตสอบถามฐานข้อมูลสำหรับการแทรกแต่ละครั้ง เปลี่ยนค่านี้และคุณทำเสร็จแล้ว
hibernate.id.new_generator_mappings
ตั้งค่ามีความสำคัญมาก ฉันหวังว่าจะเป็นการตั้งค่าเริ่มต้นที่ฉันไม่ต้องเสียเวลามากนักในการค้นคว้าว่าทำไมหมายเลขประจำตัวถึงผิดปกติ