我正在使用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。
答案 0 :(得分:0)
从nullable=false
删除JoinColumn
。默认情况下,JoinColumn设置为不可为空,如果要设置可为空的JoinColumn
,请使用属性optional
。