JPA 2.1 外键没有保存在 ManyToOne 级联上

Posted

技术标签:

【中文标题】JPA 2.1 外键没有保存在 ManyToOne 级联上【英文标题】:JPA 2.1 Foreign Key isn't saving on ManyToOne cascade 【发布时间】:2014-07-22 20:28:11 【问题描述】:

我有两节课。

public class Reservation 
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval=true, mappedBy = "reservation")
    private List<Night> nights;  \\assume getters and setters


public class Night 
    @ManyToOne
    @JoinColumn(name = "RESERVATION_ID")
    private Reservation reservation;

我的存档是这样的:

Reservation r = new Reservation();
r.getNights().add(new Night()); 
return dao.save(r);

这行得通,因为它保存了保留,它保存了黑夜。但是当我查看数据库时,NIGHT 表中的 RESERVATION_ID 列为空。

在以前的项目中(在升级到 Java 8 和 JPA 2.1 之前),我不需要手动设置子对象的父对象以保存该关联。有什么变化,还是我做错了什么?

编辑:

这会正确保存关联,但以前没有必要。

Reservation r = new Reservation();
Night n = new Night();
n.setReservation(r);
r.getNights().add(n);
return dao.save(r);

【问题讨论】:

感谢您的链接,但我看不出它如何帮助回答我的问题。正如我在代码中显示的那样,这是一种双向关系。 回到你的问题Did something change, or am I doing something wrong? 所以答案是,你没有错过。这就是它应该实施的方式。但是,您可以使其单向并单独添加/删除它们。那是你的选择(AFAIK)。 请原谅我的困惑,但您是说r.getNights().add(new Night());(在编辑之前)应该可以保存关联吗? 对不起,我的错。是的,您需要在子对象中设置父对象。您可以在 Parent 类(子类的 getter 方法)中执行此操作。 好吧,所以在编辑之后就是它应该的样子,而在编辑之前只是一些我不应该依赖的自动魔法。对吗? 【参考方案1】:

根据下面链接中提供的 JPA 示例,您需要在子对象中设置父对象。 可以在Parent类中做(子的getter方法)

http://en.wikibooks.org/wiki/Java_Persistence/OneToMany

【讨论】:

以上是关于JPA 2.1 外键没有保存在 ManyToOne 级联上的主要内容,如果未能解决你的问题,请参考以下文章

Java JPA双向ManyToOne映射不起作用

如何使用主键作为JPA和Hibernate的外键引用?

Spring Boot:与@JoinColumn 的 ManyToOne 关系保持外键为空

如何在 Spring JPA 中设置外键列

在 merge() 操作中丢失复合外键(JPA/Hibernate)

JPA @ManyToOne 用于休眠