ไฮเบอร์เนตรหัสการเพิ่มอัตโนมัติ


86

ฉันมีแอปพลิเคชัน j2ee ที่ใช้โหมดไฮเบอร์เนตพร้อมคำอธิบายประกอบ ฉันจะใส่คำอธิบายประกอบฟิลด์ Id ในคลาส pojo ของฉันได้อย่างไรเพื่อตั้งค่าเป็นการเพิ่มอัตโนมัติหรือสร้างขึ้นโดยอัตโนมัติ และในการเพิ่ม bean ฉันจะปล่อยฟิลด์นั้นไว้ใน bean null หรือไม่?

คำตอบ:


161
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

และคุณปล่อยทิ้งไว้null( 0) เมื่อยังคงมีอยู่ ( nullถ้าคุณใช้ไฟล์Integer / Longwrapper)

ในบางกรณีAUTOกลยุทธ์ได้รับการแก้ไขเพื่อให้คะแนนSEQUENCEมากกว่าIDENTITYหรือTABLEดังนั้นคุณอาจต้องการตั้งค่าด้วยตนเองเป็นIDENTITYหรือTABLE(ขึ้นอยู่กับฐานข้อมูลพื้นฐาน)

ดูเหมือนว่าSEQUENCE+ การระบุชื่อลำดับได้ผลสำหรับคุณ


รหัสของฉันเป็นสตริงประเภท จะตั้งค่าอะไรดี เพราะฉันได้รับข้อผิดพลาดนี้ เกิดจาก: javax.el.ELException: org.hibernate.exception.SQLGrammarException: ไม่สามารถรับค่าลำดับถัดไปได้
cedric

4
autoincrement หมายถึงตัวเลขที่เพิ่มขึ้น ไม่สามารถเพิ่มสตริงได้ สร้างคอลัมน์ int
Bozho

คอลัมน์ myid ในฐานข้อมูลเป็นประเภทหมายเลข และฉันได้เปลี่ยน id ใน pojo ของฉันเป็น int แล้ว ฉันได้รับลำดับข้อผิดพลาดไม่อยู่
cedric

2
สำหรับ Oracle SEQUENCE เป็นสิ่งที่ใกล้เคียงที่สุดกับการสร้างอัตโนมัติ คุณต้องสร้างลำดับก่อนเวลาเว้นแต่คุณจะปล่อยให้ Hibernate สร้างสคีมาของคุณ หากคุณคิดว่าคุณอาจรองรับหลายฐานข้อมูลในบางจุดให้ใช้ TABLE
Brian Deterling

2
อย่าใช้ข้อมูลประจำตัว Oracle ไม่รองรับข้อมูลประจำตัวรองรับลำดับ
JuanZe

33

ทำได้ดังนี้: -

@Id
@GenericGenerator(name="kaugen" , strategy="increment")
@GeneratedValue(generator="kaugen")
@Column(name="proj_id")
  public Integer getId() {
    return id;
 }

คุณสามารถใช้ชื่อใดก็ได้แทน kaugen มันทำงานได้ดีฉันเห็นคำถามด้านล่างบนคอนโซล

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)

อันนี้ใช้ได้กับฉัน แต่อย่าให้ฉันตั้งค่า ID ฉันพยายาม setID ด้วยจำนวนเต็มหรือ int แต่มันใช้ max ได้ตลอดเวลา ฉันควรทำอย่างไรดี?
desudesudesu

ใช้ @GenericGenerator (name = "IncrementId", strategy = "assign") @GeneratedValue (generator = "IncrementId") มันจะช่วยให้คุณกำหนด id ได้ด้วยตัวคุณเอง แต่ถ้าคุณไม่ผ่าน id มันจะเป็น 0
Ravi Kant

@Kaushik Lele เป็นกลยุทธ์ = "Increment" hibernate inbuilt Increment stratergy? มันมาภายใต้ SEQUENCE, IDENTITY, AUTO, TABLE เหล่านี้หรือไม่?
รู้สึกดีและเขียนโปรแกรม

แล้ว 700 ล้านระเบียนในตารางล่ะ? นี่อาจเป็นปัญหาที่ไม่มีดัชนีฉันคิดว่า
user2171669

10

FYI

การใช้netbeans คลาสเอนทิตีใหม่จากฐานข้อมูลที่มีคอลัมน์mysql * auto_increment * จะสร้างแอตทริบิวต์ให้คุณพร้อมคำอธิบายประกอบต่อไปนี้:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;

สิ่งนี้ทำให้ฉันได้รับข้อผิดพลาดเดียวกันกับที่บอกว่าคอลัมน์ต้องไม่เป็นโมฆะดังนั้นฉันจึงลบคำอธิบายประกอบ @NotNull ออกจากแอตทริบิวต์ null และใช้งานได้!


7

ไฮเบอร์เนตกำหนดกลยุทธ์การสร้างตัวระบุห้าประเภท:

อัตโนมัติ - คอลัมน์ข้อมูลประจำตัวลำดับหรือตารางขึ้นอยู่กับฐานข้อมูลพื้นฐาน

ตาราง - ตารางที่มีรหัส

IDENTITY - คอลัมน์ประจำตัว

SEQUENCE - ลำดับ

สำเนาประจำตัว - ข้อมูลประจำตัวถูกคัดลอกจากเอนทิตีอื่น

ตัวอย่างการใช้ตาราง

@Id
@GeneratedValue(strategy=GenerationType.TABLE , generator="employee_generator")
@TableGenerator(name="employee_generator", 
                table="pk_table", 
                pkColumnName="name", 
                valueColumnName="value",                            
                allocationSize=100) 
@Column(name="employee_id")
private Long employeeId;

สำหรับรายละเอียดเพิ่มเติมให้ตรวจสอบการเชื่อมโยง


5

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

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql

MySQL คือ @Column (columnDefinition = "integer auto_increment")
yeralin

1

ในกรณีที่คน "กระแทก" ในคำถามนี้ดังนั้นในการค้นหากลยุทธ์สำหรับการInformixตารางเมื่อPKเป็นชนิดอนุกรม

ฉันพบว่ามันใช้งานได้ ... เป็นตัวอย่าง

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;

สำหรับการทำงานให้แน่ใจว่าเมื่อคุณทำsession.SaveOrUpdateคุณผ่านค่าสำหรับคอลัมน์special_serial_pk โมฆะ

ในกรณีของฉันฉันทำHTML POSTด้วยJSONเช่นนั้น ...

{
"special_serial_pk": null, //<-- Field to be incremented
"specialcolumn1": 1,
"specialcolumn2": "I love to code",
"specialcolumn3": true
}

0

การใช้ netbeans คลาสเอนทิตีใหม่จากฐานข้อมูลด้วยคอลัมน์mysql auto_incrementจะสร้างแอตทริบิวต์ให้คุณด้วย hibernate.hbm.xml ต่อไปนี้: id คือการเพิ่มอัตโนมัติ

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