Angenommen, ich habe eine unidirektionale @ManyToOne
Beziehung wie die folgende:
@Entity
public class Parent implements Serializable {
@Id
@GeneratedValue
private long id;
}
@Entity
public class Child implements Serializable {
@Id
@GeneratedValue
private long id;
@ManyToOne
@JoinColumn
private Parent parent;
}
Wenn ich ein Elternteil P und Kinder C 1 ... C n habe, die auf P zurückgreifen, gibt es in JPA eine saubere und hübsche Möglichkeit, die Kinder C 1 ... C n automatisch zu entfernen, wenn P entfernt wird (dh entityManager.remove(P)
)?
Was ich suche, ist eine Funktionalität ähnlich wie ON DELETE CASCADE
in SQL.
java
jpa
jpa-2.0
many-to-one
perp
quelle
quelle
Antworten:
Beziehungen in JPA sind immer unidirektional, es sei denn, Sie ordnen den Elternteil dem Kind in beide Richtungen zu. Das Kaskadieren von REMOVE-Operationen vom Elternteil zum Kind erfordert eine Beziehung vom Elternteil zum Kind (nicht nur das Gegenteil).
Sie müssen daher Folgendes tun:
@ManyToOne
Beziehung in eine bidirektionale@ManyToOne
oder eine unidirektionale@OneToMany
. Sie können dann REMOVE-Vorgänge kaskadieren,EntityManager.remove
um die übergeordneten und untergeordneten Elemente zu entfernen. Sie können auchorphanRemoval
true angeben , um verwaiste untergeordnete Elemente zu löschen, wenn die untergeordnete Entität in der übergeordneten Auflistung auf null gesetzt ist, dh das untergeordnete Element zu entfernen, wenn es in der übergeordneten Auflistung nicht vorhanden ist.ON DELETE CASCADE
. Sie müssen nach dem AufrufEntityManager.clear()
aufrufen,EntityManager.remove(parent)
da der Persistenzkontext aktualisiert werden muss. Die untergeordneten Entitäten dürfen nach dem Löschen in der Datenbank nicht im Persistenzkontext vorhanden sein.quelle
Wenn Sie den Ruhezustand als JPA-Anbieter verwenden, können Sie die Anmerkung @OnDelete verwenden. Diese Anmerkung fügt der Beziehung den Auslöser ON DELETE CASCADE hinzu , der das Löschen der untergeordneten Elemente an die Datenbank delegiert.
Beispiel:
Mit dieser Lösung reicht eine unidirektionale Beziehung vom Kind zum Elternteil aus, um alle Kinder automatisch zu entfernen. Diese Lösung benötigt keine Listener usw. Auch eine Abfrage wie DELETE FROM Parent WHERE id = 1 entfernt die untergeordneten Elemente .
quelle
@OneToOne
Irgendwelche Ideen, wie man es lösen kann@OneToOne
?Erstellen Sie eine bidirektionale Beziehung wie folgt:
quelle
Ich habe in unidirektionalem @ManytoOne gesehen, Löschen funktioniert nicht wie erwartet. Wenn ein Elternteil gelöscht wird, sollte im Idealfall auch ein Kind gelöscht werden, aber nur das Elternteil wird gelöscht und das Kind wird NICHT gelöscht und als Waise belassen
Die verwendete Technologie ist Spring Boot / Spring Data JPA / Hibernate
Sprint Boot: 2.1.2.RELEASE
Spring Data JPA / Hibernate wird zum Löschen der Zeile .eg verwendet
parentRepository.delete(parent)
ParentRepository erweitert das Standard-CRUD-Repository wie unten gezeigt
ParentRepository extends CrudRepository<T, ID>
Im Folgenden sind meine Entitätsklassen aufgeführt
quelle
spring.jpa.hibernate.use-new-id-generator-mappings=true spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
"
Code. Siehename= "parent"
Verwenden Sie diese Methode, um nur eine Seite zu löschen
quelle
@Cascade (org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
Die gegebene Anmerkung hat bei mir funktioniert. Kann es versuchen
Zum Beispiel :-
quelle