Hibernate Javadoc für Session#delete(Object) Zustände:
Entfernen Sie eine persistente Instanz aus dem Datenspeicher. Das Argument kann eine Instanz sein, die mit der empfangenden Sitzung assoziiert ist, oder eine vorübergehende Instanz mit einer Kennung, die mit einem bestehenden persistenten Zustand assoziiert ist.
Es ist also kein Fehler, eine transiente Entität zu übergeben (wie Sie es tun). Die Session#delete
-Methode deklariert keine Ausnahmen, daher ist nicht definiert, was passiert, wenn Sie eine Entität mit einer ID übergeben, die nicht in der Datenbank vorhanden ist. Wie Sie sehen können - es passiert nichts - haben Sie die Entität angefordert, um nicht in der DB zu existieren, es ist nicht da, um damit zu beginnen, also keinen Grund, eine Ausnahme zu werfen (zumindest nach Hibernate).
Vergleichen Sie dies mit dem grundlegenden SQL DELETE FROM X WHERE ID = Y
- dies überprüft nicht, ob ein Datensatz mit ID=Y
existiert, wird es in beide Richtungen (Aktualisierung 0 oder 1 Zeilen) erfolgreich sein.
UPDATE nach der Realisierung der vorübergehenden Übergangseinheit hat null
ID.
Ich habe in die Quellen von Hibernate 5.2.2 Session
gegraben und es scheint, dass, wenn die übergebene Entität keine ID hat, keine DELETE
Abfrage sogar auf der Tabelle dieser Entität durchgeführt wird.
Siehe DefaultDeleteEventListener#onDelete(DeleteEvent, Set)
:
if (ForeignKeys.isTransient(persister.getEntityName(), entity, null, source)) {
// yes, your entity is transient according to ForeignKeys.isTransient
deleteTransientEntity(source, entity, event.isCascadeDeleteEnabled(), persister, transientEntities);
return;
}
Jetzt
protected void deleteTransientEntity(
EventSource session,
Object entity,
boolean cascadeDeleteEnabled,
EntityPersister persister,
Set transientEntities) {
LOG.handlingTransientEntity(); // Only log it
if (transientEntities.contains(entity)) {
LOG.trace("Already handled transient entity; skipping");
return;
}
transientEntities.add(entity);
// Cascade deletion to related entities
cascadeBeforeDelete(session, persister, entity, null, transientEntities);
cascadeAfterDelete(session, persister, entity, transientEntities);
}
dies nur "HHH000114: Handling transient entity in delete processing"
in den Protokollen gedruckt wird und nichts tun mit dem Unternehmen (aber es wird die Streichung der verbundenen Unternehmen kaskadieren, wenn es sind irgendwelche - nicht dein Fall).
Also noch einmal - es ist in Ordnung, eine transiente Einheit ohne ID zu übergeben - es wird einfach keine DELETE
auf der DB laufen.
Als eine Randnotiz, würde ich empfehlen, dass Sie Spring Data JPA betrachten. Diese gesamte Methode kann für Sie von gründlich getesteten und weit verbreiteten Bibliotheken automatisch generiert werden. – chrylis
Danke, aber ich muss selbst schreiben CrudDao, sein Teil meines Kurses Test – zzheads