首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JPA OneToMany和ManyToOne:列不允许错误NULL

JPA OneToMany和ManyToOne:列不允许错误NULL
EN

Stack Overflow用户
提问于 2014-03-27 20:22:22
回答 2查看 8.4K关注 0票数 3

我使用带有hibernate的JPA作为提供程序。有两个实体:

代码语言:javascript
运行
复制
@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”之前被持久化):

代码语言:javascript
运行
复制
...
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();
...

上次刷新时抛出一个异常:

代码语言:javascript
运行
复制
    ... 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”中,因为在它的构造函数中:

代码语言:javascript
运行
复制
this.proyecto = proyecto;

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

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-31 17:13:20

最后,我解决了这个问题。我在两个类中显示的映射没有任何问题。我所展示的关于Proyecto和Incidencia的映射以前是不同的。类Incidencia使用了一个Id类的复合主键:

代码语言:javascript
运行
复制
@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类从数据库中移出包时,一切都正常工作。

我想为问这个不准确的问题而道歉。

谢谢你的帮助。

票数 1
EN

Stack Overflow用户

发布于 2014-03-27 20:48:23

在这行之后

代码语言:javascript
运行
复制
proyecto.getIncidencias().add(incidencia);

您需要对意外事件对象设置一个反向引用。

代码语言:javascript
运行
复制
incidencia.setProyecto(proyecto);

那就冲。

似乎不正确的做法是,将proyectoFind传递到意外的构造函数中,然后将相同的对象添加到不同的Proyecto对象中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22698405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档