我想知道为什么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<>();

07-24 14:43