@รหัสคำอธิบายประกอบ
แต่ละ Entity เอนทิตีใน Hibernate ต้องมีฟิลด์ที่จะเป็นคีย์หลัก: ซึ่งมีค่าเฉพาะสำหรับออบเจกต์ทั้งหมดในคลาสนี้ โดยปกติแล้ว ฟิลด์นี้จะมีคำอธิบายประกอบด้วย@Id คำอธิบาย ประกอบ
แบบฟอร์มทั่วไป:
@Id
Class Name;
ตัวอย่าง:
@Entity
@Table(name="user")
class User
{
@Id
@Column(name="id")
public Integer id;
@Embedded
public UserAddress address;
@Column(name="created_date")
public Date createdDate;
}
ตำแหน่งคำอธิบายประกอบ
อย่างไรก็ตาม คุณสามารถเขียน คำอธิบายประกอบ @Columnได้ ไม่เพียงแต่สำหรับฟิลด์เท่านั้น แต่ยังสำหรับเมธอดด้วย: สำหรับ getters หรือ setters ตัวอย่าง:
@Entity
@Table(name="user")
class User
{
public Integer id;
public Date createdDate;
@Id
@Column(name="id")
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="created_date")
public Date getDate() {
return this.createdDate;
}
public void setCreatedDate(Date date) {
this. createdDate = date;
}
}
แนวทางนี้ปรากฏขึ้นเมื่อมีการเพิ่มคำอธิบายประกอบไม่เพียงแต่ในคลาสเท่านั้น แต่ยังรวมถึงอินเทอร์เฟซด้วย อินเทอร์เฟซไม่มีฟิลด์คลาส แต่มีเมธอด: getters และ setters ไฮเบอร์เนตรองรับทั้งสองมาตรฐานนี้
สำคัญ! หากคลาสมี คำอธิบาย ประกอบ @Entityฟิลด์ทั้งหมดของคลาสจะได้รับการปฏิบัติโดย Hibernate เป็นฟิลด์ถาวร (เว้นแต่จะมี คำอธิบายประกอบ @Transient ระบุไว้ ) แม้ว่าเขตข้อมูลจะไม่มีคำอธิบายประกอบใดๆ เลย: ในกรณีนี้ ชื่อคอลัมน์จะถือว่าเท่ากับชื่อเขตข้อมูลของคลาส
นี่คือจุดที่ คำอธิบายประกอบ @Idมีบทบาทสำคัญ หากใส่คำอธิบายประกอบในฟิลด์คลาส Hibernate จะดูชื่อและประเภทของฟิลด์ หาก ใส่คำอธิบายประกอบ @Idบนเมธอด Hibernate จะดูชื่อและประเภทของเมธอด
ตัวอย่างที่ 1:
@Entity
@Table(name="user")
class User
{
@Id
public Integer id;
public Date createdDate; //this field will be treated as if it had @Column(name=" createdDate ")
}
ตัวอย่างที่ 2:
@Entity
@Table(name="user")
class User
{
public Integer id;
public Date createdDate;
@Id
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public Date getDate() { //this field will be treated as if it had @Column(name=”date ”)
return this.createdDate;
}
public void setCreatedDate(Date date) {
this. createdDate = date;
}
}
คำอธิบายประกอบ @GeneratedValue
คุณสามารถกำหนด id ให้กับวัตถุใหม่ของคุณด้วยตนเอง หรือปล่อยให้อยู่ในความเมตตาของ Hibernate เพื่อให้ Hibernate เข้าใจวิธีกำหนด ID ให้กับออบเจกต์ของคุณได้ดียิ่งขึ้น จึงมีคำอธิบายประกอบพิเศษ:
@GeneratedValue
คำอธิบายประกอบ นี้มักจะทำเครื่องหมายช่องเดียวกับ คำอธิบายประกอบ @Id เธอมี 4 กลยุทธ์การกำหนด ID ที่เป็นไปได้:
- อัตโนมัติ
- ตัวตน
- ลำดับ
- โต๊ะ
ตัวอย่างของคำอธิบายประกอบที่มีกลยุทธ์ที่ระบุ:
@Entity
@Table(name="user")
class User
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer id;
public Date createdDate;
}
หากไม่ได้ระบุค่านโยบาย กลยุทธ์ AUTO จะถูกเลือก กลยุทธ์ AUTO หมายความว่าไฮเบอร์เนตจะกำหนด ID เอง โดยอิงจากประเภทข้อมูลของฟิลด์ ID เป็นหลัก
ทำไมต้องเป็นประเภท? ได้ เนื่องจากประเภทรหัสอาจแตกต่างกันมาก เช่น สตริงหรือ GUID ตัวอย่าง:
@Entity
@Table(name="user")
class User
{
@Id
@GeneratedValue
public UUID id;
public Date createdDate;
}
หมายเหตุ: GUID ใน Java เรียกว่า UUID ตามประวัติศาสตร์ และไฮเบอร์เนตสามารถสร้าง UUID เฉพาะสำหรับออบเจกต์ของคุณได้หากคุณขอให้สร้าง
กลยุทธ์ @GeneratedValue ที่หลากหลาย
หากคุณระบุประเภทGeneratedValue(strategy = GenerationType.IDENTITY)ไฮเบอร์เนตจะมอบสิทธิ์การตั้งค่า ID ให้กับชั้นฐานข้อมูล โดยปกติจะใช้คอลัมน์ที่มีป้ายกำกับว่า PRIMARY KEY, AUTOINCREMENT
แต่ถ้าคุณต้องการให้ ID ของคุณไม่ซ้ำกันและสร้างขึ้นตามอัลกอริทึมที่ระบุเป็นพิเศษ คุณสามารถใช้ คำอธิบายประกอบ GeneratedValue(strategy = GenerationType.SEQUENCE)ตัวอย่างเช่น:
@Entity
@Table(name="user")
public class User {
@Id
@GeneratedValue(generator = "sequence-generator")
@GenericGenerator(
name = "sequence-generator",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "user_sequence"),
@Parameter(name = "initial_value", value = "4"),
@Parameter(name = "increment_size", value = "1")
}
)
private long userId;
// ...
}
มีหลายวิธีในการสร้าง ID ตัวอย่างเช่น คุณอาจมีคีย์เฉพาะแบบผสมที่ประกอบด้วยหลายคอลัมน์ และเมื่อเขียนวัตถุลงในฐานข้อมูล คุณต้องกรอกข้อมูลในคอลัมน์เหล่านี้ทั้งหมด
ฉันจะไม่ให้รายละเอียด ถึงกระนั้น จุดประสงค์ของการบรรยายของเราก็คือการทำความคุ้นเคยกับ Hibernate และไม่ใช่เพื่อบอกเล่าเอกสารที่เป็นทางการอีกครั้ง
GO TO FULL VERSION