hibernate:保存多个关联问题

1cosmwyk  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(249)

我有三个有关系的实体。

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之前保存文章?
还有其他解决办法吗?
谢谢

ebdffaop

ebdffaop1#

对于双向关系,您有责任确保在内存模型上正确设置双方,否则您将看到错误。
所以你需要打电话: article.setPage(page); 理想情况下,应该封装操作,以便内存中的模型始终保持一致:

public class Page{

    public List<Article> getArticles(){
      return Collections.unmodifiableList(articles); //force through add method
    }

    public void addArticle(Article article){
        articles.add(article);
        article.setPage(this);
    }
}

相关问题