我想知道为什么Hibernate不将外键插入数据库。
我有2类之间的OneToMany和ManyToOne关系。
@Entity
@Data
public class Bestelling {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JoinColumn(name = "bestelling_id")
private long bestellingID;
private Date bestelDatum;
@ManyToOne
@JoinColumn(name = "account_id")
private Account accountID_fk;
@JoinColumn(name = "adres_id")
@OneToOne
private Adres afleverAdres;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "bestelling")
private List<Bestellingsregel> bestellingsregels = new ArrayList<>();
}
和
@Entity
@Data
public class Bestellingsregel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JoinColumn(name = "bestellingsregel_id")
private long bestellingsregelID;
private int aantal;
private double prijs;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "bestelling_id")
private Bestelling bestelling;
@OneToOne
@JoinColumn(name = "product_id")
private Product productID;
}
我正在使用Postman将数据插入MySql数据库:
{
"bestelDatum" : "2019-02-28",
"accountID_fk" : {
"accountID" : 1
},
"afleverAdres" : {
"adres_id" : 1
},
"bestellingsregels" : [
{ "aantal" : 5,
"prijs" : 100.50,
"productID" : { "productID" : 1 }
}
]
}
它正在插入数据库。唯一的问题是,它没有在表Bestellingsregel中设置bestelling_id。任何想法我在这里做错了吗?
提前致谢。
编辑:
我正在使用Spring,而crud函数位于此接口内:
public interface BestellingRepository extends JpaRepository<Bestelling, Long> {
}
最佳答案
您将Bestelling和Bestellingsregel之间的关系定义为双向的,并且在Bestellingsregel中拥有拥有方(按住外键),这是正确的,但有其优点和缺点。
您有以下选择:
按照定义使用您的关系,并将Bestelling对象设置为列表中的每个Bestellingsregel对象。 Bestellingsregel是所有者,因此您必须在保存之前直接设置参考。
使您的关系成为单向的:从Bestellingsregel中删除Bestelling参考并重新定义我们的@OneToMany
关系
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, , orphanRemoval = true)
@JoinColumn(name = "bestelling_id")
private List<Bestellingsregel> bestellingsregels = new ArrayList<>();