我有三个有关系的实体。
public class Site {
@OneToMany
private List<Page> pages;
}
public class Page {
@OneToMany
private List<Article> articles;
@OneToMany
private List<TopArticle> topArticles;
}
public class Article {
@ManyToOne
private Page page;
}
public class TopArticle {
@ManyToOne
@JoinColumn(name = "PageId")
private Page page;
@OneToOne
@JoinColumn(name = "ArticleId")
private Article article;
}
toparticle中的字段page和arctile有数据库限制-不为空((需要重新限制)
我必须保存与所有协会网站。
Article article = new Article();
TopArticle topArticle = new TopArticle();
Page page = new Page();
page.getArticles().add(article);
page.getTopArticles().add(topArticle);
Site site = new Site();
site.getPages().add(page);
siteDAO.save(site);
有时它可以保存站点。但有时会出错。
com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert the value NULL into column 'ArticleId', table '...TopArticle'; column does not allow nulls. INSERT fails
似乎页面保存后,它会尝试保存关联列表文章和列表主题文章。也许,当列表文章在列表toparticles之前保存时,它就工作了。另一方面,它失败了。
问题:
在jpa中保存属性顺序是否有问题?
我如何强制hibernate在topcarticles之前保存文章?
还有其他解决办法吗?
谢谢
1条答案
按热度按时间ebdffaop1#
对于双向关系,您有责任确保在内存模型上正确设置双方,否则您将看到错误。
所以你需要打电话:
article.setPage(page);
理想情况下,应该封装操作,以便内存中的模型始终保持一致: