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.ALL
tegese kabeh tumindak sing ditindakake karo obyek induk kudu diulang kanggo obyek sing gumantung.
CascadeType.PERSIST
tegese 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.MERGE
tegese yen kita nganyari obyek induk ing database, banjur padha kudu rampung karo obyek gumantung sawijining.
6.4 Mbusak, Mbusak, Mbusak
CascadeType.REMOVE
tegese yen kita mbusak obyek sepah ing database, banjur padha kudu rampung karo obyek gumantung sawijining.
CascadeType.DELETE
tegese padha. Iki minangka sinonim. Mung saka specifications beda.
CascadeType.DETACH
tegese 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.REFRESH
lan CascadeType.SAVE_UPDATE
bisa 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.