我正在将JPA与休眠一起用作提供程序。有两个实体:
@Entity
@Table(name = "PROYECTOS")
public class Proyecto {
@Id
private Long id;
...
@OneToMany(mappedBy = "proyecto", cascade = CascadeType.PERSIST, orphanRemoval = true)
private List<Incidencia> incidencias;
...
}
@Entity
@Table(name = "INCIDENCIAS")
public class Incidencia {
@Id
private Long id;
...
@ManyToOne(cascade = CascadeType.PERSIST, optional = false)
@JoinColumn(name = "ID_PROYECTO", nullable = false)
@NotNull
private Proyecto proyecto;
...
public Incidencia(Proyecto proyecto, Usuario usuario, String descripcion,
Date fechaYHora) {
super();
this.proyecto = proyecto;
this.usuario = usuario;
this.descripcion = descripcion;
this.fechaYHora = fechaYHora;
}
...
}
当我执行测试方法并尝试保留“ Incidencia”类时(以前“ Proyecto”被保留):
...
entityManager.persist(proyecto);
entityManager.flush();
...
Incidencia incidencia = new Incidencia(proyectoFind, usuario,
"1ª incidencia del proyecto", new Date());
proyecto.getIncidencias().add(incidencia);
entityManager.persist(proyecto);
entityManager.flush();
...
从最后一次刷新抛出异常:
... 35 more
Caused by: org.h2.jdbc.JdbcBatchUpdateException: La columna "PROYECTO" no permite valores nulos (NULL)
NULL not allowed for column "PROYECTO"; SQL statement:
insert into INCIDENCIAS (DESCRIPCION, FECHA_Y_HORA, ID_PROYECTO, ID_USUARIO, ID) values (?, ?, ?, ?, ?) [23502-175]
at org.h2.jdbc.JdbcPreparedStatement.executeBatch(JdbcPreparedStatement.java:1167)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 41 more
我确定在“ Incidencia”中设置了“ proyecto”,因为在其构造函数中:
this.proyecto = proyecto;
所以,我不明白为什么会抛出该异常。
任何帮助是极大的赞赏。
最佳答案
最后,我已经能够解决问题。
我在这两个课程中介绍的映射都没有任何问题。我以前显示的关于Proyecto和Incidencia的那些映射是不同的。 Incidencia类使用具有ID类的复合主键:
@Entity
@Table(name = "INCIDENCIAS")
@IdClass(IncidenciaKey.class)
public class Incidencia implements Serializable {
@Id
@Column(name = "ID")
private Integer id;
@Id
@Column(name = "ID_PROYECTO", nullable = false, insertable = false, updatable = false)
private Long idProyecto;
@ManyToOne(cascade = CascadeType.PERSIST)
@NotNull
@Valid
private Proyecto proyecto;
...
}
我只是将这个旧版本的Incidencia重命名,所以@Table(name =“ INCIDENCIAS”)有两个类。我想这是错误的。内存数据库中仍然有一个名为“ PROYECTO”的列,它来自这个已重命名的对象,而且我认为这是未使用的实体。
从数据库中将重命名的Incidencia类移出软件包后,一切就可以正常工作了。
我想问这个不正确的问题。
谢谢您的帮助。
关于java - JPA OneToMany和ManyToOne:列不允许使用错误NULL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22698405/