1

Content有一个 Map Footnote,并且Footnote有一content_id列是返回的外键Content。不幸的是Content,使用footnoteMap包含 a保存我Footnote会引发以下错误:

ERROR: Cannot insert the value NULL into column 'content_id', table 'CMT_DEV.dbo.footnote'; column does not allow nulls. INSERT fails.
SEVERE: org.springframework.dao.DataIntegrityViolationException: Cannot insert the value NULL into column 'content_id', table 'CMT_DEV.dbo.footnote'; column does not allow nulls. INSERT fails.; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Cannot insert the value NULL into column 'content_id', table 'CMT_DEV.dbo.footnote'; column does not allow nulls. INSERT fails.

我必须缺少使这项工作所需的注释,但我无法弄清楚它是什么。

这是我的 JPA 映射:

public class Content implements EntityModel, Serializable {
    @OneToMany(mappedBy="contentId", cascade=CascadeType.ALL)
    @MapKey(name="number")
    @OrderBy("number ASC")
    private Map<Integer, Footnote> footnoteMap;

    ....
}

public class Footnote implements EntityModel, Serializable {
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name = "content_id", referencedColumnName= "id")
    private Content contentId;

    ....
}

* 更新 *

请记住,在Footnote添加 a 时,内容项尚未保存。

4

2 回答 2

0

首先,请注意,您有责任将双向关系的双方保持在一致状态,即当您添加 a 时FootnoteContent您也应该适当地设置它contentId

如果您这样做了但仍然失败,那么可能是数据库模式和 Hibernate 映射之间不匹配。请注意,content_id列有一个非空约束,但映射中没有任何内容告诉 Hibernate 存在这样的约束。试试@ManyToOne(cascade=CascadeType.ALL, optional = false)

于 2012-08-23T14:36:39.107 回答
0

你需要有这样的东西......

public void addFootnote(Footnote footnote) {
    if (footnote == null) {
        throw new IllegalArgumentException("Null argument not allowed");
    }
    footnote.setContent(this);
    footNoteMap.put(<KEY_OF_MAP>, footnote);
}

例如,这将确保content已填充Footnote

于 2012-08-23T14:43:16.033 回答