gpt4 book ai didi

java - 没有父 ID 作为外键的子表 - JPA/Hibernate

转载 作者:行者123 更新时间:2023-12-05 07:51:04 25 4
gpt4 key购买 nike

也许存在一个非常明显的答案,但我看不到。我有一个父表 Parent 和一个子表 Child。

@Entity
@Table(name="PARENT")
public class Parent implements Serializable {

@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="PARENT_ID")
private int parentId;

@JsonBackReference
@OneToMany(mappedBy="parent", cascade = CascadeType.ALL)
private List<Child> childs;
....
}

和子实体。

@Entity
@Table(name="CHILD")
public class Child implements Serializable {
@EmbeddedId
private ChildPK id;

@ManyToOne
@JsonManagedReference
@JoinColumn(name="PARENT_ID",insertable = false, updatable = false, referencedColumnName = "PARENT_ID")
private Parent parent;
....
}

复合主键是:

@Embeddable
public class ChildPK implements Serializable {

@Column(name="CTGRY_ID", insertable=false, updatable=false)
private int ctgryId;

@Column(name="PARENT_ID", insertable=false, updatable=false)
private int parentId;
....
}

现在在我的服务方法中,我设置了双向关系

childItem.setParent(parent);

parent.setChilds(childItemList);

并在实体上调用保存:

parentDao.save(parent);

这会按预期为 PARENT 表创建一个新条目,其中包含由表标识生成的 pk。使用表身份生成的 pk 按预期在 CHILD 表中创建新插入。然而,子条目的fk本应是parentId,却变成了0!

我错过了什么吗?虽然这个问题不是唯一的,但当我尝试在网上查找类似问题时,几乎所有的建议似乎都不相关。

如果您需要更多详细信息,请告诉我。谢谢!

最佳答案

您正在使两个 id 的条目都不可插入(一个必须是可插入的,否则 JPA 实现不知道从哪里获取 id):

@ManyToOne
@JsonManagedReference
@JoinColumn(name="PARENT_ID", insertable = false, updatable = false, referencedColumnName = "PARENT_ID")
private Parent parent;

@Column(name="PARENT_ID", insertable=false, updatable=false)
private int parentId;

您应该从父对象中删除 insertable = false(第一个示例)。另一种选择是从第二个中删除可插入的错误,并在@prepersist 中“手动”制作它:

@PrePersist
protected setIdsBeforeSave() {
this.id = new ChildPK(parent.Id, categoryId);
}

编辑

选项 1

@Entity
@Table(name="CHILD")
public class Child implements Serializable {
@EmbeddedId
private ChildPK id;

@ManyToOne
@JsonManagedReference
@JoinColumn(name="PARENT_ID", referencedColumnName = "PARENT_ID")
private Parent parent;
....
}

其他类保持不变

选项 2

@Entity
@Table(name="CHILD")
public class Child implements Serializable {
@EmbeddedId
private ChildPK id;
....
@PrePersist
protected void setIdsBeforeSave() {
//You set the parent ID, so wont be null, idk what category means, that why i just put the 0
this.id = new ChildPK(parent.Id, 0);
}
}

关于java - 没有父 ID 作为外键的子表 - JPA/Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35560683/

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