Tengo dos entidades, relacionadas de la siguiente manera
@Entity @Table(name = "APPOINTMENT") public class Appointment { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long codeAp; @ManyToOne(fetch = FetchType.EAGER) , @OnDelete(action = OnDeleteAction.CASCADE) @JoinColumn(name = "codeP") private Patient patient; //attributes //getters and setters //constructors @Entity @Table(name = "PATIENT") public class Patient { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long codeP; //attributes //getters and setters //constructorsEstoy usando el método de eliminación de JpaRepository. Hay una restricción entre las tablas PACIENTE y CITA en la base de datos, quiero eliminar huérfanos, cuando elimino Paciente. ¡Agregué la anotación de hibernación @OnDelete pero no funciona para mí! ¿Puedes decirme por qué? Quiero mantener esa relación unidireccional, ¿me pueden ayudar en esto?
Si desea seguir usando la asociación solo como unidireccional, puede definir el lado inverso con carga diferida en un campo sin exponer a los captadores y definidores:
@Entity public class Patient { @OneToMany(mappedBy = "patient", orphanRemoval = true) private Collection<Appointment> appointments; } De esta manera, la lógica de orphanRemoval de huérfanos se aplica de los pacientes a sus citas y, como beneficio adicional, obtiene la capacidad de navegar de los pacientes a las citas en las consultas HQL.
Observe el atributo mappedBy que indica que las citas son responsables de la administración de la asociación, por lo que continúa asociando citas con pacientes configurando pacientes en la relación de muchos a uno definida en Appointment .
No hay forma de que pueda lograr ese comportamiento automático en el lado de @ManyToOne . Es simplemente semánticamente incorrecto, punto.
Sin embargo, teniendo en cuenta el hecho de que solo desea tener un mapeo unidireccional y no especificar la dependencia Set<Appointment> en el Patient , entonces una especie de solución a su situación sería reemplazar el @ManyToOne con un @OneToOne . Entonces podría usar la funcionalidad orphan-removal :
@OneToOne(fetch = FetchType.EAGER, orphanRemoval=true) @JoinColumn(name = "codeP") private Patient patient; Sin embargo, tenga en cuenta que si sigue este camino, adapte su código y, en algún momento, necesitará introducir la dependencia @OneToMany en el lado `Patient', entonces se encontrará con problemas. Por lo tanto, recomendaría resolver primero los pros y los contras en relación con la posible alteración futura del gráfico de entidades.