Postaram się, abyś zrozumiał na przykładzie. Załóżmy, że masz tabelę relacyjną (STUDENT) z dwiema kolumnami oraz ID (int) i NAME (String). Teraz, jako ORM, utworzyłbyś klasę encji mniej więcej następującą: -
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;
/**
* @author vaibhav.kashyap
*
*/
@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;
}
}
Załóżmy, że tabela zawiera już wpisy. Teraz, jeśli ktoś poprosi Cię o dodanie kolejnej kolumny „AGE” (liczba całkowita)
ALTER TABLE STUDENT ADD AGE int NULL
Będziesz musiał ustawić wartości domyślne na NULL, aby dodać kolejną kolumnę do wstępnie wypełnionej tabeli. To sprawia, że dodajesz kolejne pole w klasie. Teraz pojawia się pytanie, czy do deklarowania pola będziesz używać pierwotnego typu danych, czy nieprymitywnego typu opakowującego danych.
@Column(name = "AGE")
private int age;
lub
@Column(name = "AGE")
private INTEGER age;
będziesz musiał zadeklarować pole jako niepymitywny opakowujący typ danych, ponieważ kontener będzie próbował zamapować tabelę na jednostkę. W związku z tym nie byłby w stanie odwzorować wartości NULL (domyślnie), gdybyś nie zadeklarował pola jako opakowania i ostatecznie wyrzuciłby komunikat „Wartość Null została przypisana do właściwości ustawiającej typ pierwotny” Wyjątek.