无法通过 EntityManager#remove() 删除实体

Can not remove an entity through EntityManager#remove()

我正在使用 JPA。 我有以下代码:

@Entity
public class NucleoFamiliar {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String nombre;

    private Date fechaCreacion;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "ID_ADMINISTRADOR", nullable = false)
    private Usuario administrador;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "INTEGRANTE_NUCLEO_FAMILIAR", joinColumns = {
            @JoinColumn(name = "ID_NUCLEO_FAMILIAR") }, inverseJoinColumns = @JoinColumn(name = "ID_USUARIO"))
    private List<Usuario> integrantes;

    getters, setters...
}

@Stateless
@LocalBean
public class SampleBusiness {
    @EJB
    private INucleoFamiliarDao nucleoFamiliarDao;

    public void excute() {
        NucleoFamiliar n = nucleoFamiliarDao.find(58);
        nucleoFamiliarDao.remove(n);
    }
}

@ManagedBean
@SessionScoped
public class Testing implements Serializable {

    private static final long serialVersionUID = 1L;
    @EJB
    SampleBusiness ejb;

    public void execute() {
        ejb.execute();
    }

}

及部分日志

01:29:50,609 INFO  [stdout] (default task-16) Hibernate: select nucleofami0_.ID_NUCLEO_FAMILIAR as ID_NUCLE1_11_0_, nucleofami0_.ID_ADMINISTRADOR as ID_ADMIN4_11_0_, nucleofami0_.FECHA_DE_CREACION as FECHA_DE2_11_0_, nucleofami0_.NOMBRE as NOMBRE3_11_0_, usuario1_.ID_USUARIO as ID_USUAR1_14_1_, usuario1_.ACTIVO as ACTIVO2_14_1_, usuario1_.APELLIDO as APELLIDO3_14_1_, usuario1_.EMAIL as EMAIL4_14_1_, usuario1_.NOMBRE as NOMBRE5_14_1_, usuario1_.PASSWORD as PASSWORD6_14_1_, usuario1_.TELEFONO as TELEFONO7_14_1_ from NUCLEO_FAMILIAR nucleofami0_ inner join USUARIO usuario1_ on nucleofami0_.ID_ADMINISTRADOR=usuario1_.ID_USUARIO where nucleofami0_.ID_NUCLEO_FAMILIAR=?

01:29:50,623 INFO  [stdout] (default task-16) Hibernate: select integrante0_.ID_NUCLEO_FAMILIAR as ID_NUCLE1_8_0_, integrante0_.ID_USUARIO as ID_USUAR2_8_0_, usuario1_.ID_USUARIO as ID_USUAR1_14_1_, usuario1_.ACTIVO as ACTIVO2_14_1_, usuario1_.APELLIDO as APELLIDO3_14_1_, usuario1_.EMAIL as EMAIL4_14_1_, usuario1_.NOMBRE as NOMBRE5_14_1_, usuario1_.PASSWORD as PASSWORD6_14_1_, usuario1_.TELEFONO as TELEFONO7_14_1_ from INTEGRANTE_NUCLEO_FAMILIAR integrante0_ inner join USUARIO usuario1_ on integrante0_.ID_USUARIO=usuario1_.ID_USUARIO where integrante0_.ID_NUCLEO_FAMILIAR=?

01:29:50,629 INFO  [stdout] (default task-16) Hibernate: select gruposjaas0_.ID_USUARIO as ID_USUAR2_7_0_, gruposjaas0_.ID_GRUPO_JAAS as ID_GRUPO1_7_0_, grupojaas1_.ID_GRUPO_JAAS as ID_GRUPO1_5_1_, grupojaas1_.DESCRIPCION as DESCRIPC2_5_1_, grupojaas1_.NOMBRE as NOMBRE3_5_1_ from INTEGRANTE_GRUPO_JAAS gruposjaas0_ inner join GRUPO_JAAS grupojaas1_ on gruposjaas0_.ID_GRUPO_JAAS=grupojaas1_.ID_GRUPO_JAAS where gruposjaas0_.ID_USUARIO=?

01:29:50,631 INFO  [stdout] (default task-16) Hibernate: select nucleosfam0_.ID_USUARIO as ID_USUAR2_8_0_, nucleosfam0_.ID_NUCLEO_FAMILIAR as ID_NUCLE1_8_0_, nucleofami1_.ID_NUCLEO_FAMILIAR as ID_NUCLE1_11_1_, nucleofami1_.ID_ADMINISTRADOR as ID_ADMIN4_11_1_, nucleofami1_.FECHA_DE_CREACION as FECHA_DE2_11_1_, nucleofami1_.NOMBRE as NOMBRE3_11_1_, usuario2_.ID_USUARIO as ID_USUAR1_14_2_, usuario2_.ACTIVO as ACTIVO2_14_2_, usuario2_.APELLIDO as APELLIDO3_14_2_, usuario2_.EMAIL as EMAIL4_14_2_, usuario2_.NOMBRE as NOMBRE5_14_2_, usuario2_.PASSWORD as PASSWORD6_14_2_, usuario2_.TELEFONO as TELEFONO7_14_2_ from INTEGRANTE_NUCLEO_FAMILIAR nucleosfam0_ inner join NUCLEO_FAMILIAR nucleofami1_ on nucleosfam0_.ID_NUCLEO_FAMILIAR=nucleofami1_.ID_NUCLEO_FAMILIAR inner join USUARIO usuario2_ on nucleofami1_.ID_ADMINISTRADOR=usuario2_.ID_USUARIO where nucleosfam0_.ID_USUARIO=?

01:29:50,638 INFO  [stdout] (default task-16) Hibernate: select gruposjaas0_.ID_USUARIO as ID_USUAR2_7_0_, gruposjaas0_.ID_GRUPO_JAAS as ID_GRUPO1_7_0_, grupojaas1_.ID_GRUPO_JAAS as ID_GRUPO1_5_1_, grupojaas1_.DESCRIPCION as DESCRIPC2_5_1_, grupojaas1_.NOMBRE as NOMBRE3_5_1_ from INTEGRANTE_GRUPO_JAAS gruposjaas0_ inner join GRUPO_JAAS grupojaas1_ on gruposjaas0_.ID_GRUPO_JAAS=grupojaas1_.ID_GRUPO_JAAS where gruposjaas0_.ID_USUARIO=?

01:29:50,640 INFO  [stdout] (default task-16) Hibernate: select nucleosfam0_.ID_USUARIO as ID_USUAR2_8_0_, nucleosfam0_.ID_NUCLEO_FAMILIAR as ID_NUCLE1_8_0_, nucleofami1_.ID_NUCLEO_FAMILIAR as ID_NUCLE1_11_1_, nucleofami1_.ID_ADMINISTRADOR as ID_ADMIN4_11_1_, nucleofami1_.FECHA_DE_CREACION as FECHA_DE2_11_1_, nucleofami1_.NOMBRE as NOMBRE3_11_1_, usuario2_.ID_USUARIO as ID_USUAR1_14_2_, usuario2_.ACTIVO as ACTIVO2_14_2_, usuario2_.APELLIDO as APELLIDO3_14_2_, usuario2_.EMAIL as EMAIL4_14_2_, usuario2_.NOMBRE as NOMBRE5_14_2_, usuario2_.PASSWORD as PASSWORD6_14_2_, usuario2_.TELEFONO as TELEFONO7_14_2_ from INTEGRANTE_NUCLEO_FAMILIAR nucleosfam0_ inner join NUCLEO_FAMILIAR nucleofami1_ on nucleosfam0_.ID_NUCLEO_FAMILIAR=nucleofami1_.ID_NUCLEO_FAMILIAR inner join USUARIO usuario2_ on nucleofami1_.ID_ADMINISTRADOR=usuario2_.ID_USUARIO where nucleosfam0_.ID_USUARIO=?

01:29:50,701 INFO  [stdout] (default task-16) Hibernate: update NUCLEO_FAMILIAR set ID_ADMINISTRADOR=?, FECHA_DE_CREACION=?, NOMBRE=? where ID_NUCLEO_FAMILIAR=?

01:29:50,705 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-16) SQL Error: 1048, SQLState: 23000
01:29:50,705 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-16) Column 'ID_ADMINISTRADOR' cannot be null

为什么要更新 NUCLEO_FAMILIAR:

update NUCLEO_FAMILIAR set ID_ADMINISTRADOR=?, FECHA_DE_CREACION=?, NOMBRE=? where ID_NUCLEO_FAMILIAR=?)?!!

这就是问题所在,因为它试图将外键设置为 null。

从您的 JoinColumn 中删除 nullable=false。默认情况下,JoinColumn 设置为不可空,如果要设置可空 JoinColumn,请使用属性 optional