我有以下问题:有一个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'不能为null”,因为f_key是一个引用尚未生成的a.id值的外键。
问题:如何以“X方式”保存它?
答案 0 :(得分:1)
我认为你有两个问题:
首先,您要映射双向关系,但只是“半心半意”,即您没有将A映射到B,只映射到它的ID。
更好地映射:
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,也可以进行单向映射。
答案 1 :(得分:0)
您可以尝试以下代码:
Class A {
...
@JsonIgnore
private Long id; @Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
@JsonView(View.Extended.class )
List<B> b;
@OneToMany(cascade=CascadeType.PERSIST, orphanRemoval = true, fetch = FetchType.EAGER)
@JoinColumn(name="b_fkey")
public List<B> getB(List<B> bList){
return b;
}
public void setB(List<B> bList){
this.b = bList;
}
getter和setter的注释可以让你更好地控制hibernate列。