ฉันมีแอปพลิเคชัน j2ee ที่ใช้โหมดไฮเบอร์เนตพร้อมคำอธิบายประกอบ ฉันจะใส่คำอธิบายประกอบฟิลด์ Id ในคลาส pojo ของฉันได้อย่างไรเพื่อตั้งค่าเป็นการเพิ่มอัตโนมัติหรือสร้างขึ้นโดยอัตโนมัติ และในการเพิ่ม bean ฉันจะปล่อยฟิลด์นั้นไว้ใน bean null หรือไม่?
ฉันมีแอปพลิเคชัน j2ee ที่ใช้โหมดไฮเบอร์เนตพร้อมคำอธิบายประกอบ ฉันจะใส่คำอธิบายประกอบฟิลด์ Id ในคลาส pojo ของฉันได้อย่างไรเพื่อตั้งค่าเป็นการเพิ่มอัตโนมัติหรือสร้างขึ้นโดยอัตโนมัติ และในการเพิ่ม bean ฉันจะปล่อยฟิลด์นั้นไว้ใน bean null หรือไม่?
คำตอบ:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
และคุณปล่อยทิ้งไว้null
( 0
) เมื่อยังคงมีอยู่ ( null
ถ้าคุณใช้ไฟล์Integer
/ Long
wrapper)
ในบางกรณีAUTO
กลยุทธ์ได้รับการแก้ไขเพื่อให้คะแนนSEQUENCE
มากกว่าIDENTITY
หรือTABLE
ดังนั้นคุณอาจต้องการตั้งค่าด้วยตนเองเป็นIDENTITY
หรือTABLE
(ขึ้นอยู่กับฐานข้อมูลพื้นฐาน)
ดูเหมือนว่าSEQUENCE
+ การระบุชื่อลำดับได้ผลสำหรับคุณ
ทำได้ดังนี้: -
@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 (?, ?, ?, ?, ?)
FYI
การใช้netbeans คลาสเอนทิตีใหม่จากฐานข้อมูลที่มีคอลัมน์mysql * auto_increment * จะสร้างแอตทริบิวต์ให้คุณพร้อมคำอธิบายประกอบต่อไปนี้:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;
สิ่งนี้ทำให้ฉันได้รับข้อผิดพลาดเดียวกันกับที่บอกว่าคอลัมน์ต้องไม่เป็นโมฆะดังนั้นฉันจึงลบคำอธิบายประกอบ @NotNull ออกจากแอตทริบิวต์ null และใช้งานได้!
ไฮเบอร์เนตกำหนดกลยุทธ์การสร้างตัวระบุห้าประเภท:
อัตโนมัติ - คอลัมน์ข้อมูลประจำตัวลำดับหรือตารางขึ้นอยู่กับฐานข้อมูลพื้นฐาน
ตาราง - ตารางที่มีรหัส
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;
หากคุณมีคอลัมน์ตัวเลขที่ต้องการเพิ่มค่าอัตโนมัติอาจเป็นตัวเลือกสำหรับตั้งค่าcolumnDefinition
โดยตรง สิ่งนี้มีข้อดีคือสคีมาจะสร้างค่าโดยอัตโนมัติแม้ว่าจะใช้โดยไม่จำศีลก็ตาม สิ่งนี้อาจทำให้รหัสของคุณเฉพาะ db แม้ว่า:
import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql
ในกรณีที่คน "กระแทก" ในคำถามนี้ดังนั้นในการค้นหากลยุทธ์สำหรับการ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
}
การใช้ netbeans คลาสเอนทิตีใหม่จากฐานข้อมูลด้วยคอลัมน์mysql auto_incrementจะสร้างแอตทริบิวต์ให้คุณด้วย hibernate.hbm.xml ต่อไปนี้: id คือการเพิ่มอัตโนมัติ