6.1 Manajemen ketergantungan jero

Lan sawetara liyane migunani lan menarik babagan @OneToMany anotasi lan liya-liyane. Kabeh duwe 4 opsi sing umum digunakake:

  • cascade = CascadeType.ALL
  • yatim panyingkiran = bener
  • njupuk = FetchType.LAZY

Saiki kita bakal nganalisa kanthi luwih rinci. Lan kita bakal miwiti karo sing paling menarik - CascadeType . Parameter iki nemtokake apa sing kudu kelakon kanggo entitas gumantung yen kita ngganti entitas utama.

Spesifikasi JPA nduweni nilai ing ngisor iki kanggo parameter iki:

  • KABEH
  • TETEP
  • GABUNGAN
  • Mbusak
  • REFRESH
  • DETACH

Nanging, Hibernate ngembangake spesifikasi iki dadi telung opsi liyane:

  • REPLIKA
  • SAVE_UPDATE
  • KUNCI

Ana, mesthi, paralel kuwat karo database lan CONSTRANIS sing. Nanging, ana uga beda. Hibernate nyoba kanggo ndhelikake karya nyata karo database sabisa, supaya Hibernate Cascades iki persis babagan obyek Entitas.

6.2 Tipe Kaskade

Parameter cascade nggambarake apa sing kudu kelakon kanggo obyek gumantung yen kita ngganti wong tuwa (obyek master). Paling asring, parameter iki digunakake bebarengan karo anotasi sing njlèntrèhaké dependensi obyek:

Tuladha:

OneToOne(cascade = CascadeType.ALL)

Utawa kaya iki:

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})

Bisa uga ditulis minangka anotasi sing kapisah:

@Cascade({ org.hibernate.annotations.CascadeType.ALL })

Saiki ayo ngomong luwih akeh babagan apa tegese anotasi kasebut.

6.3 KABEH, PERSISTE, MERGE

CascadeType.ALLtegese kabeh tumindak sing ditindakake karo obyek induk kudu diulang kanggo obyek sing gumantung.

CascadeType.PERSISTtegese yen kita nyimpen obyek induk menyang database, banjur padha kudu rampung karo obyek gumantung sawijining. Tuladha:


@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @OneToOne(cascade = CascadeType.PERSIST, mappedBy="task")
   private EmployeeTask task;
}

Conto nggarap kelas iki:


Employee director = new Employee();
EmployeeTask task = new EmployeeTask();
director.task = task;
 
session.persist(director);
session.flush();

Kita mung nyimpen obyek saka jinis Employee, obyek gumantung EmployeeTask bakal disimpen ing database kanthi otomatis.

CascadeType.MERGEtegese yen kita nganyari obyek induk ing database, banjur padha kudu rampung karo obyek gumantung sawijining.

6.4 Mbusak, Mbusak, Mbusak

CascadeType.REMOVEtegese yen kita mbusak obyek sepah ing database, banjur padha kudu rampung karo obyek gumantung sawijining.

CascadeType.DELETEtegese padha. Iki minangka sinonim. Mung saka specifications beda.

CascadeType.DETACHtegese yen kita mbusak obyek sepah saka sesi, banjur padha kudu rampung karo obyek gumantung sawijining. Tuladha:


@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @OneToOne(cascade = CascadeType.DETACH, mappedBy="task")
   private EmployeeTask task;
}

Conto nggarap kelas iki:


Employee director = new Employee();
EmployeeTask task = new EmployeeTask();
director.task = task;
director.task = task;
session.flush();
 
assertThat(session.contains(director)).isTrue();
assertThat(session.contains(task)).isTrue();
 
session.detach(director);
 
assertThat(session.contains(director)).isFalse();
assertThat(session.contains(task)).isFalse();

CascadeType.REFRESHlan CascadeType.SAVE_UPDATEbisa ing cara sing padha kita nyana - padha duplikat tumindak sing dileksanakake karo obyek tiyang sepah kanggo obyek gumantung sawijining.

6.5 Opsi mbusak yatim piatu

Uga kadhangkala sampeyan bisa nemokake parameter kasebut orphan. Iki cendhak kanggo mbusak Orphan. Iki digunakake kanggo mesthekake yen ora ana entitas anak tanpa entitas induk.

OneToOne(orphan = true)

Yen parameter iki disetel dadi bener, banjur entitas anak bakal dibusak yen wis ilangkabeh pranala. Iku ora persis padha karo Cascade.REMOVE.

Sampeyan bisa uga duwe kahanan nalika sawetara entitas induk ngrujuk marang bocah siji. Banjur iku ono gunane sing ora dibusak bebarengan karo pambusakan entitas induk, nanging mung yen kabeh referensi kanggo iku nullified.

Ayo ngomong sampeyan duwe kelas:


@Entity
@Table(name="user")
class Employee {
   @Column(name="id")
   public Integer id;
 
   @OneToMany(cascade = CascadeType.ALL, orphan = true)
   @JoinColumn(name = "employee_id")
   private Set<EmployeeTask> tasks = new HashSet<EmployeeTask>();
}


Employee director = session.find(Employee.class, 4);
EmployeeTask task = director.tasks.get(0);
director.tasks.remove(task)
session.persist(director);
session.flush();

Obyek EmployeeTask bakal dibusak amarga ora ana referensi sing ditinggalake. Ing wektu sing padha, ora ana sing mbusak obyek induk.

6.6 pilihan njupuk

Opsi njupuk ngidini sampeyan ngontrol carane obyek gumantung dimuat. Biasane njupuk siji saka rong nilai:

  • FetchType.LAZY
  • FetchType.EAGER

Iki minangka topik sing menarik banget kanthi macem-macem pitfalls, mula luwih becik aku ngomong babagan iki ing kuliah sing kapisah.