การแมปเอนทิตีด้วยคำอธิบาย JPA
กำหนด @Entity, @Table, @Id, @GeneratedValue, @Column และ @Embedded เพื่อออกแบบเอนทิตีอย่างเป็นระเบียบ
การแมปเอนทิตีด้วยคำอธิบาย JPA เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
การแมปเอนทิตีของ JPA คืออะไร
JPA (Jakarta Persistence API) ใช้คำอธิบายประกอบเพื่อแมปคลาส Java กับตารางฐานข้อมูล Hibernate เป็นผู้ให้บริการ JPA ที่ใช้กันมากที่สุด ไม่จำเป็นต้องเขียน SQL DDL เพราะ JPA จะสร้างโครงสร้างฐานข้อมูลจากคำอธิบายประกอบ
@Entity และ @Table
@Entity ใช้ระบุคลาสให้เป็นเอนทิตีของ JPA ส่วน @Table ใช้ปรับแต่งชื่อตาราง สคีมา และข้อจำกัดด้านความไม่ซ้ำกัน เอนทิตีทุกตัวต้องมีคอนสตรัคเตอร์ที่ไม่มีอาร์กิวเมนต์ ซึ่งสามารถกำหนดให้มีสิทธิ์เข้าถึงเป็น protected ได้
@Entity
@Table(name = "users", uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class User {
// ...
protected User() {} // required by JPA
}@Id และ @GeneratedValue
@Id ใช้ระบุฟิลด์คีย์หลัก ส่วน @GeneratedValue ใช้กำหนดกลยุทธ์การสร้างค่าอัตโนมัติ ได้แก่ IDENTITY (ฐานข้อมูลเพิ่มค่าอัตโนมัติ), SEQUENCE (ลำดับของฐานข้อมูล เหมาะกว่าสำหรับการแทรกข้อมูลจำนวนมาก) หรือ AUTO
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}@Column: การปรับแต่งคอลัมน์
@Column ใช้กำหนดชื่อคอลัมน์ ความยาว การอนุญาตค่า null และความไม่ซ้ำกัน หากไม่ใช้คำอธิบายประกอบนี้ ชื่อฟิลด์จะกลายเป็นชื่อคอลัมน์
@Column(name = "full_name", nullable = false, length = 100)
private String name;
@Column(name = "email", unique = true, nullable = false)
private String email;
@Column(name = "created_at", updatable = false)
private LocalDateTime createdAt;@Embedded และ @Embeddable
แยกกลุ่มคอลัมน์ออกมาเป็นออบเจ็กต์ค่าที่นำกลับมาใช้ซ้ำได้ โดยกำกับด้วย @Embeddable จากนั้นใช้ @Embedded ในเอนทิตีเพื่อรวมฟิลด์ของออบเจ็กต์นั้น
@Embeddable
public class Address {
private String street, city, country;
@Column(name = "zip_code") private String zipCode;
}
@Entity
public class User {
@Embedded private Address address;
}@Enumerated: การบันทึกค่าแจกแจง
บันทึกค่าแจกแจงเป็นสตริงชื่อ (STRING) หรือเป็นจำนวนเต็มลำดับที่ (ORDINAL) ควรใช้ STRING เสมอ เพราะค่าลำดับจะแตกหักเมื่อมีการจัดลำดับค่าของค่าแจกแจงใหม่
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private UserStatus status; // stored as "ACTIVE", "INACTIVE", etc.@CreationTimestamp และ @UpdateTimestamp
คำอธิบายประกอบเฉพาะของ Hibernate ที่กำหนดเวลาประทับโดยอัตโนมัติเมื่อแทรกและปรับปรุงข้อมูลตามลำดับ จึงไม่จำเป็นต้องใช้ @PrePersist ด้วยตนเอง
@CreationTimestamp
@Column(updatable = false)
private LocalDateTime createdAt;
@UpdateTimestamp
private LocalDateTime updatedAt;@Transient: การยกเว้นฟิลด์
ฟิลด์ที่กำกับด้วย @Transient จะไม่ถูกบันทึกลงฐานข้อมูล ใช้คำอธิบายประกอบนี้กับฟิลด์ที่คำนวณหรือได้มาจากค่าอื่นและไม่ควรจัดเก็บไว้ในฐานข้อมูล
@Transient
public String getFullName() { return firstName + " " + lastName; }@Lob: ออบเจ็กต์ขนาดใหญ่
ใช้ @Lob เพื่อแมปคอลัมน์ข้อความขนาดใหญ่ (TEXT/CLOB) หรือคอลัมน์ไบนารี (BLOB) PostgreSQL จะแมป @Lob String เป็น TEXT
@Lob
@Column(name = "content")
private String content; // maps to TEXT in PostgreSQLสัญญาของ equals และ hashCode
เอนทิตี JPA ที่อยู่ในคอลเลกชันต้องใช้งาน equals / hashCode โดยอิงจากคีย์ทางธุรกิจ (ไม่ใช่ ID ที่สร้างขึ้น ซึ่งเป็นค่า null ก่อนบันทึก) ให้ใช้ @NaturalId หรือคีย์ทดแทนแบบ UUID
@Override public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User u)) return false;
return email != null && email.equals(u.email);
}
@Override public int hashCode() { return getClass().hashCode(); }@Version สำหรับการล็อกเชิงมองในแง่ดี
เพิ่มฟิลด์ @Version โดย Hibernate จะเพิ่มค่าฟิลด์นี้ทุกครั้งที่มีการปรับปรุงข้อมูล หากธุรกรรมสองรายการปรับปรุงแถวเดียวกันพร้อมกัน รายการที่สองจะโยน OptimisticLockException
@Version
private Long version; // auto-managed by Hibernateตรวจสอบความเข้าใจอย่างรวดเร็ว
เหตุใด @Enumerated จึงควรใช้ STRING แทน ORDINAL
ทบทวน
ใช้ @Entity/@Table สำหรับการแมประหว่างคลาสกับตาราง ใช้ @Id+@GeneratedValue สำหรับคีย์หลัก ใช้ @Column สำหรับข้อจำกัด ใช้ @Embedded สำหรับออบเจ็กต์ค่า ควรใช้ @Enumerated(STRING) เสมอ และเพิ่ม @Version สำหรับการล็อกเชิงมองในแง่ดี
คำถามที่พบบ่อย
บทเรียน “การแมปเอนทิตีด้วยคำอธิบาย JPA” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การแมปเอนทิตีด้วยคำอธิบาย JPA” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การแมปเอนทิตีด้วยคำอธิบาย JPA”
กำหนด @Entity, @Table, @Id, @GeneratedValue, @Column และ @Embedded เพื่อออกแบบเอนทิตีอย่างเป็นระเบียบ คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การแมปเอนทิตีด้วยคำอธิบาย JPA” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การแมปเอนทิตีด้วยคำอธิบาย JPA
- รีโพซิทอรี Spring Data และเมธอดค้นหา
- ความสัมพันธ์แบบหนึ่งต่อกลุ่มและกลุ่มต่อกลุ่ม
- การแบ่งหน้า การเรียงลำดับ และโปรเจกชัน