gpt4 book ai didi

java - Hibernate 不会在插入时将外键设置为父级主键的值

转载 作者:太空宇宙 更新时间:2023-11-03 11:40:18 29 4
gpt4 key购买 nike

我有 3 个具有层次关系的表:

佩奇(祖母)

    public class Page extends BaseDAO {

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "page_id", unique = true, nullable = false)
public Integer getPageId() {
return this.pageId;
}

@OneToMany(fetch = FetchType.EAGER, mappedBy = "page", cascade=CascadeType.ALL, orphanRemoval=true)
@NotFound(action = NotFoundAction.IGNORE)
public Set<PageWell> getPageWells() {
return this.pageWells;
}
}

PageWell(妈妈)

    public class PageWell extends BaseDAO {
@Id
@Column(name = "page_well_id", unique = true, nullable = false)
public int getPageWellId() {
return this.pageWellId;
}

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "page_id", nullable = false)
public Page getPage() {
return this.page;
}

@OneToMany(fetch = FetchType.EAGER, mappedBy = "pageWell", cascade=CascadeType.ALL)
public Set<PageComponentAttribute> getPageComponentAttributes() {
return this.pageComponentAttributes;
}
}

PageComponentAttribute(子)

    public class PageComponentAttribute extends BaseDAO {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "page_component_attribute_id", unique = true, nullable = false)
public Integer getPageComponentAttributeId() {
return this.pageComponentAttributeId;
}

@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn(name = "page_well_id", nullable = false)
public PageWell getPageWell() {
return this.pageWell;
}
}

三个表的主键在MySQL中都是AutoIncrement。预期的行为是当我保存 Page 时,所有 PageWell 对象都被保存,所有 PageComponentAttribute 对象也被保存。

出于某种原因,它对于 Grandmonther -> Daughter 关系正常工作。但是在 Mother -> Daughter 关系的情况下,Daughter 的外键每次都设置为 0。这显然导致了违反约束。我暂时去掉了那个关系的FK约束,记录进表了,但是FK还是0。

我的保存代码是这样的:

    Page page = getPage(request);  //getPage() finds an instance of page, or creates and persists a new instance if none exists.
Set<PageWell> wells = page.getPageWells();
wells.clear(); //delete all related PageWell objects so we can re-create them from scratch

page = pageHome.merge(page);
wells = page.getPageWells();
PageWell pageWell;

// Now create a new PageWell and set up bi-directonal mapping with Page. This part works great.
pageWell = new PageWell();
pageWell.setPage(page);
wells.add(pageWell);

// Now do the exact same thing with the PageComponentAttribute objects
PageComponentAttribute pca = new PageComponentAttribute();
pca.setPageWell(pageWell);
pca.getPageWell().getPageComponentAttributes().add(pca);

// Now save the Page
page = pageHome.merge(page);

当我查看数据库时,PageComponentAttribute表中的FK设置为​​0。同样,我暂时从MySQL中删除了FK约束只是为了让记录无异常保存,但是除此之外,我做错了什么?

最佳答案

我会尝试做其中一件事,或者全部:

1) 从@ManyToOne 中移除级联。一般来说,这样配置不是一个好主意。它基本上只对@OneToMany 和@OneToOne 有意义。

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "page_well_id", nullable = false)
public PageWell getPageWell() {
return this.pageWell;
}

2)尝试使用 Hibernate 级联配置而不是 JPA:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "pageWell")
@Cascade(CascadeType.ALL)
public Set<PageComponentAttribute> getPageComponentAttributes() {
return this.pageComponentAttributes;
}

可能存在一些细微差异,请参阅:article

3) 不确定为什么在 page 实体上调用 merge 两次。我会在最后坚持使用一个。

4) 我想到的最后一个解决方法是在此处执行显式刷新:

pageWell = new PageWell();
pageWell.setPage(page);
wells.add(pageWell);
session.flush();

然后:

PageComponentAttribute pca = new PageComponentAttribute();
pca.setPageWell(pageWell);
pca.getPageWell().getPageComponentAttributes().add(pca);

session.merge(pageWell);

理论上,由于刷新,pageWell 应该已经生成了 primary,它不应该再为 0。

我希望我现在有一个测试环境来正确测试它。

关于java - Hibernate 不会在插入时将外键设置为父级主键的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42356649/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com