Hibernate: Cascade macht Probleme - lieber weglassen?

Markus

Grünschnabel
Hi,

ich habe ein Problem mit den Cascades in Hibernate. Bei meinem letzten Projekt habe ich versucht in die Annotations Cascades für das löschen von Objekten zu definieren.
Beispiel:

Note * <- -> 1 Appointment

Code:
@OneToMany (mappedBy = "Appointment", fetch = FetchType.EAGER)
	@Cascade(value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
	@JoinColumn(name="FK_ID_APPOINTMENT")
	private Set<Note> Notes;

Ich wollte die Cascades so definieren, dass wenn ich das Appointment lösche, automatisch alle Notes gelöscht werden.
Habe dann aber im offiziellen Hibernateforum gelsen, dass von den DELETE-Cascades abgeraten wird. Bei komplexeren Problemen sollte das "individuell" im Code gelöst werden. Habe ich drauf gehört und es folgendermaßen implementiert:

Code:
public boolean del(int pos) {
		Appointment app = this.get(pos);                   //in einer abstrakten Hibernate-Manager Klasse definiert
		Set<Note> notes = app.getNotes();
		for (Iterator<Note> i = notes.iterator(); i.hasNext();) {
			Note note = (Note)i.next();
			super.delHibernateEntity(note, Note.class);   //in einer abstrakten Hibernate-Manager Klasse definiert
			System.out.println(note.getID());
		}
		app.setAttender_User(new HashSet<User>());
		this.update(app);                        //in einer abstrakten Hibernate-Manager Klasse definiert
		return super.delHibernateEntity(app, Appointment.class);              //in einer abstrakten Hibernate-Manager Klasse definiert
	}

Meine Frage nun: Was macht für euch mehr Sinn? Cascade oder selbst implementieren?

Gruß
Markus
 

sebastianb

Erfahrenes Mitglied
Hi,

also ich verwende hierfür die JPA Annotations und das funktioniert ohne Probleme:

Department.class
Java:
@OneToMany(mappedBy = "department", cascade = { CascadeType.MERGE, CascadeType.DETACH, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.REMOVE }, fetch = FetchType.LAZY)
private Set<Account> accounts;

Beim Löschen ist nur darauf zu achten, dass die Integrität nicht verletzt wird z.B. wenn es noch Entities gibt, welche die zu löschende Department Entity noch referenzieren.

Gruß Sebastian
 

robgeb

Mitglied
Hi,

ich bin generell gegen cascade.

Denn mit wachsender Struktur wird das nicht mehr wartbar. Dann lieber mehr Geist in das Löschen setzen. Da weiß man wenigstens was passiert.

Einzige Ausnahme an der ich die Cascade-Types setzen würde, wären OneToOne-Beziehungen. Diese Beziehungen kommen aber eben seeehr selten vor ;-)