Seleccionar página

Para indicar que una foranea se quiere poner en BD en modo CASCADE hay que usar la siguiente anotación:

@OnDelete(action = OnDeleteAction.CASCADE)

Un ejemplo, en la clase Establecimiento, que tiene un listado de Características, la tabla establecimiento_caracteristicas que tiene como foranea el id_establecimiento. Si queremos que esa foranea sea puesta en la BD como CASCADE hay que poner lo siguiente:

@Entity
@Table(name = "establecimiento")
public class Establecimiento implements java.io.Serializable {

...

private Set<EstablecimientoCaracteristica> establecimientoCaracteristicas = new HashSet<EstablecimientoCaracteristica>(
0);

....

@OnDelete(action = OnDeleteAction.CASCADE)
@OneToMany(fetch = FetchType.LAZY, mappedBy = "establecimiento")
public Set<EstablecimientoCaracteristica> getEstablecimientoCaracteristicas() {
return this.establecimientoCaracteristicas;
}

...

}

Si se le quisiera poner un nombre concreto a esa foranea se podría hacer con la anotación siguiente:

@ForeignKey(name=”FK_ESTABLECIMIENTO”)

Si en vez de como en el ejemplo anterior que es un OneToMany fuera un @ManyToMany aqui hay otro ejemplo, en el que se usa “inverseName” ya que hay que crear 2 foraneas en la tabla de enlace del ManyToMany:

@Entity
public class Woman {
    ...
    @ManyToMany(cascade = {CascadeType.ALL})
    @ForeignKey(name = "TO_WOMAN_FK", inverseName = "TO_MAN_FK")
    public Set<Man> getMens() {
        return mens;
    }
}

alter table Man_Woman add constraint TO_WOMAN_FK foreign key (woman_id) references Woman
alter table Man_Woman add constraint TO_MAN_FK foreign key (man_id) references Man