@Id annotation
Ang bawat entity ng Entity sa Hibernate ay dapat may field na magiging pangunahing key: naglalaman ito ng natatanging value para sa lahat ng object ng klase na ito. Karaniwan, ang field na ito ay may annotation ng @Id annotation .
Pangkalahatang anyo:
@Id
Class Name;
Halimbawa:
@Entity
@Table(name="user")
class User
{
@Id
@Column(name="id")
public Integer id;
@Embedded
public UserAddress address;
@Column(name="created_date")
public Date createdDate;
}
Paglalagay ng anotasyon
Sa pamamagitan ng paraan, maaari mong isulat ang @Column annotation hindi lamang para sa mga field, kundi pati na rin para sa mga pamamaraan: para sa mga getter o setter. Halimbawa:
@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;
}
}
Ang diskarte na ito ay lumitaw nang magsimulang idagdag ang mga anotasyon hindi lamang sa mga klase, kundi pati na rin sa mga interface. Ang interface ay walang mga field ng klase, ngunit may mga pamamaraan: getter at setter. Sinusuportahan ng hibernate ang parehong mga pamantayang ito.
Mahalaga! Kung ang isang klase ay may @Entity annotation , ang lahat ng field nito ay ituturing ng Hibernate bilang mga permanenteng field (maliban kung ang mga ito ay may tinukoy na @Transient annotation ). Kahit na ang mga field ay walang anumang anotasyon: sa kasong ito, ang pangalan ng column ay itinuturing na katumbas ng pangalan ng field ng klase.
Dito gumaganap ng mahalagang papel ang @Id annotation. Kung ilalagay ang anotasyon sa isang field ng klase, titingnan ng Hibernate ang mga pangalan at uri ng mga field. Kung ang @Id annotation ay inilagay sa isang paraan, pagkatapos ay titingnan ng Hibernate ang mga pangalan at uri ng mga pamamaraan.
Halimbawa 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 ")
}
Halimbawa 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 annotation
Maaari kang magtalaga ng isang id sa iyong mga bagong bagay sa iyong sarili, o iwanan ito sa awa ng Hibernate. Upang mas maunawaan ng Hibernate kung paano magtalaga ng mga ID sa iyong mga bagay, mayroon itong espesyal na anotasyon:
@GeneratedValue
Karaniwang minarkahan ng annotation na ito ang parehong field bilang ang @Id annotation . Mayroon siyang 4 na posibleng diskarte sa pagtatalaga ng ID:
- AUTO
- IDENTIDAD
- PAGSUNOD
- TABLE
Isang halimbawa ng isang anotasyon na may tinukoy na diskarte:
@Entity
@Table(name="user")
class User
{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer id;
public Date createdDate;
}
Kung walang tinukoy na halaga ng patakaran, pipiliin ang diskarte sa AUTO. Ang diskarte ng AUTO ay nangangahulugan na ang Hibernate ay magtatalaga ng ID mismo, batay sa uri ng data ng field ng ID.
Bakit sa type? Oo, dahil maaaring ibang-iba ang mga uri ng ID, halimbawa, String o GUID. Halimbawa:
@Entity
@Table(name="user")
class User
{
@Id
@GeneratedValue
public UUID id;
public Date createdDate;
}
Tandaan: Ang isang GUID sa Java ay tinatawag na UUID, ayon sa kasaysayan. At ang Hibernate ay maaaring makabuo ng mga natatanging UUID para sa iyong mga bagay kung hihilingin mo ito.
Iba't ibang @GeneratedValue Strategies
Kung tinukoy mo ang uri ng GeneratedValue(strategy = GenerationType.IDENTITY) , pagkatapos ay ide-delegate ng Hibernate ang setting ng ID sa layer ng database. Kadalasan, gumagamit ito ng column na may label na PANGUNAHING SUSI, AUTOINCREMENT.
Ngunit kung gusto mong maging natatangi at nabuo ang iyong mga ID ayon sa isang espesyal na tinukoy na algorithm, maaari mong gamitin ang GeneratedValue(strategy = GenerationType.SEQUENCE) annotation , halimbawa:
@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;
// ...
}
Marami pang paraan para makabuo ng ID. Halimbawa, maaaring mayroon kang pinagsama-samang natatanging key na binubuo ng ilang column. At kapag nagsusulat ng isang bagay sa database, kailangan mong punan ang lahat ng mga column na ito.
Hindi ko sila bibigyan ng detalye. Gayunpaman, ang layunin ng aming mga lektura ay upang maging pamilyar sa Hibernate, at hindi muling isalaysay ang opisyal na dokumentasyon.