Di que tengo un unidireccional @ManyToOne
relación como la siguiente:
@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;
}
Si tengo un padre P e hijos C 1 ... C n haciendo referencia a P, ¿hay una forma limpia y bonita en JPA de eliminar automáticamente a los hijos C 1 ... C n cuando se elimina P (es decir entityManager.remove(P)
)?
Lo que estoy buscando es una funcionalidad similar a ON DELETE CASCADE
SQL.
java
jpa
jpa-2.0
many-to-one
perpetrador
fuente
fuente
Respuestas:
Las relaciones en JPA son siempre unidireccionales, a menos que asocie al padre con el hijo en ambas direcciones. Las operaciones REMOVE en cascada del padre al hijo requerirán una relación del padre al hijo (no solo lo contrario).
Por lo tanto, deberá hacer esto:
@ManyToOne
relación unidireccional a bidireccional@ManyToOne
o unidireccional@OneToMany
. A continuación, puede realizar operaciones REMOVE en cascada paraEntityManager.remove
eliminar el padre y los hijos. También puede especificarorphanRemoval
como verdadero, para eliminar cualquier hijo huérfano cuando la entidad hijo en la colección principal se establece en nula, es decir, eliminar el hijo cuando no está presente en la colección principal.ON DELETE CASCADE
. Deberá invocarEntityManager.clear()
después de llamar,EntityManager.remove(parent)
ya que el contexto de persistencia debe actualizarse; se supone que las entidades secundarias no deben existir en el contexto de persistencia después de que se hayan eliminado en la base de datos.fuente
Si está usando hibernate como su proveedor de JPA, puede usar la anotación @OnDelete. Esta anotación agregará a la relación el disparador ON DELETE CASCADE , que delega la eliminación de los hijos a la base de datos.
Ejemplo:
Con esta solución, una relación unidireccional del niño al padre es suficiente para eliminar automáticamente a todos los niños. Esta solución no necesita oyentes, etc. Además, una consulta como DELETE FROM Parent WHERE id = 1 eliminará los hijos.
fuente
@OneToOne
Alguna idea de cómo solucionarlo@OneToOne
?Crea una relación bidireccional, como esta:
fuente
He visto en @ManytoOne unidireccional, eliminar no funciona como se esperaba. Cuando se elimina el padre, lo ideal es que el niño también se elimine, pero solo se elimina el padre y el niño NO se elimina y se deja como huérfano
Las tecnologías utilizadas son Spring Boot / Spring Data JPA / Hibernate
Arranque de Sprint: 2.1.2.RELEASE
Spring Data JPA / Hibernate se usa para eliminar la fila .eg
parentRepository.delete(parent)
ParentRepository extiende el repositorio CRUD estándar como se muestra a continuación
ParentRepository extends CrudRepository<T, ID>
Los siguientes son mi clase de entidad
fuente
spring.jpa.hibernate.use-new-id-generator-mappings=true spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
"
en el código. Vername= "parent"
Utilice esta forma para eliminar solo un lado
fuente
@Cascade (org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
La anotación dada funcionó para mí. Puede intentarlo
Por ejemplo :-
fuente