ฉันจะพยายามทำให้คุณเข้าใจด้วยความช่วยเหลือของตัวอย่าง สมมติว่าคุณมีตารางเชิงสัมพันธ์ (STUDENT) ที่มีสองคอลัมน์และ ID (int) และ NAME (สตริง) ตอนนี้ในฐานะ ORM คุณจะสร้างคลาสเอนทิตีได้ดังนี้: -
package com.kashyap.default;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "STUDENT")
public class Student implements Serializable {
private static final long serialVersionUID = -1354919370115428781L;
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "NAME")
private String name;
public Student(){
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ให้สมมติว่าตารางมีรายการอยู่แล้ว ตอนนี้ถ้ามีคนขอให้คุณเพิ่มคอลัมน์ "AGE" (int) อีกคอลัมน์
แก้ไขตารางนักเรียนเพิ่มอายุ int เป็นโมฆะ
คุณจะต้องตั้งค่าเริ่มต้นเป็น NULL เพื่อเพิ่มคอลัมน์อื่นในตารางที่เติมไว้ล่วงหน้า ทำให้คุณเพิ่มเขตข้อมูลอื่นในชั้นเรียน ตอนนี้คำถามเกิดขึ้นว่าคุณจะใช้ประเภทข้อมูลดั้งเดิมหรือชนิดข้อมูลที่ไม่ใช่แบบดั้งเดิมสำหรับการประกาศฟิลด์
@Column(name = "AGE")
private int age;
หรือ
@Column(name = "AGE")
private INTEGER age;
คุณจะต้องประกาศเขตข้อมูลเป็นชนิดข้อมูลที่ไม่ใช่แบบดั้งเดิมของ wrapper เนื่องจากคอนเทนเนอร์จะพยายามแมปตารางกับเอนทิตี ดังนั้นจึงไม่สามารถแมปค่า NULL (ค่าเริ่มต้น) ได้หากคุณไม่ประกาศฟิลด์เป็น wrapper และในที่สุดก็จะโยน "ค่า Null ถูกกำหนดให้กับคุณสมบัติของตัวตั้งค่าประเภทดั้งเดิม"