0Pricing
Java Academy · บทเรียน

การแมปเอนทิตีด้วยคำอธิบาย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแมปเอนทิตีด้วยคำอธิบาย JPA
  2. รีโพซิทอรี Spring Data และเมธอดค้นหา
  3. ความสัมพันธ์แบบหนึ่งต่อกลุ่มและกลุ่มต่อกลุ่ม
  4. การแบ่งหน้า การเรียงลำดับ และโปรเจกชัน
← กลับไปที่ Java Academy