gpt4 book ai didi

java - JPA hibernate 。在一次调用中将具有外键引用的父实体和子实体持久化到父实体

转载 作者:行者123 更新时间:2023-11-30 10:39:49 25 4
gpt4 key购买 nike

我有以下问题:有 A 类

 Class A {
...

@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
@JsonIgnore
private Long id;

@OneToMany(cascade=CascadeType.PERSIST, orphanRemoval = true, fetch = FetchType.EAGER)
@JsonView(View.Extended.class )
@JoinColumn(name="b_fkey", referencedColumnName = "id")
List<B> b;
...
}

和 B 类:

 Class B {
...
private Long b_fkey;
...
}

我试图坚持如下:

 ...
A a = new A();
a.setStuff();
A aa = aDao.save(a);
// no list of B's

for(B b : List<B>) {
b.setB_fkey(aa.getId());
bDao.persist(b);
}
...

这非常有效,但我希望它以以下 X 方式保存:

 ...
A a = new A();
a.setStuff();
a.setB(List<B>)
aDao.persist(a);
...

现在它抛出错误“Column 'f_key' cannot be null”,因为 f_key 是引用尚未生成的 a.id 值的外键。

问题:“X方式”如何保存?

最佳答案

我认为你有两个问题:

首先,您正在映射一个双向关系,但只是“三心二意”,即您没有将 A 映射到 B,只是映射了它的 ID。

更好的 map 如下:

Class B {

@ManyToOne(...)
private A a;
}

其次,如果您在 Hibernate 中映射双向关系,则必须设置双方(参见 https://howtoprogramwithjava.com/hibernate-onetomany-bidirectional-relationship/)。

这主要是通过以下方法完成的:

Class A {
void setB(List<B> bs) {
this.bs = bs;
for (B b: bs) {
b.setA(this);
}
}
}

如果B中不需要A,也可以进行单向映射。

关于java - JPA hibernate 。在一次调用中将具有外键引用的父实体和子实体持久化到父实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39170505/

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