gpt4 book ai didi

java - JPA 一对多和多对一 : Error NULL not allowed for column

转载 作者:行者123 更新时间:2023-11-30 11:20:28 26 4
gpt4 key购买 nike

我将 JPA 与 hibernate 作为提供程序一起使用。有两个实体:

@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

我确信“proyecto”是在“Incidencia”中设置的,因为在它的构造函数中:

this.proyecto = proyecto;

所以,我不明白为什么会抛出这个异常。

非常感谢任何帮助。

最佳答案

终于,我解决了这个问题。我在两个类(class)中呈现的映射都没有任何问题。我展示的那些关于 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 一对多和多对一 : Error NULL not allowed for column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22698405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com