我的Content
的Map为Footnote
,而Footnote
的content_id
列为回溯到Content
的外键。不幸的是,用包含Content
的footnoteMap
保存我的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
时尚未保存内容项。 最佳答案
首先,请注意,将双向关系的双方保持一致状态是您的责任,即,在Footnote
中添加Content
时,还应适当设置其contentId
。
如果您这样做了,但仍然失败,则可能是数据库模式与Hibernate映射不匹配。请注意,content_id
列具有非null约束,但是映射中没有任何内容告诉Hibernate这样的约束存在。尝试@ManyToOne(cascade=CascadeType.ALL, optional = false)
。