Java Spring数据JPA:一对一实例化问题:PersistentObjectException:传递给persist的分离实体

Java Spring数据JPA:一对一实例化问题:PersistentObjectException:传递给persist的分离实体,java,spring-boot,jpa,spring-data-jpa,Java,Spring Boot,Jpa,Spring Data Jpa,我正在写一个简单的订单付款一对一协会: 订单类别相关代码: @Entity public class Order implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; (...) @OneToOne(cascade=CascadeType.ALL, mappedBy="order") priva

我正在写一个简单的订单付款一对一协会:

订单类别相关代码:

@Entity
public class Order implements Serializable {

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

    (...)   

    @OneToOne(cascade=CascadeType.ALL, mappedBy="order")
    private Payment payment;
@Entity
public class Payment implements Serializable {

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

    @OneToOne
    @MapsId 
    private Order order;
付款类别相关代码:

@Entity
public class Order implements Serializable {

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

    (...)   

    @OneToOne(cascade=CascadeType.ALL, mappedBy="order")
    private Payment payment;
@Entity
public class Payment implements Serializable {

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

    @OneToOne
    @MapsId 
    private Order order;
然后,我想实现一个基本方法,使用Spring数据JPA存储库为我的测试数据库种子,但是如果我尝试以下代码,我会得到一个
PersistentObjectException
,表示
分离的实体传递给persist

Order o1 = new Order(null, Instant.parse("2019-06-20T19:53:07Z"));
orderRepository.save(o1);
Payment p1 = new Payment(null, Instant.parse("2019-06-23T13:02:55Z"), o1);
paymentRepository.save(p1);
如果我这样做,同样的问题也会发生:

Order o1 = new Order(null, Instant.parse("2019-06-20T19:53:07Z"));
Payment p1 = new Payment(null, Instant.parse("2019-06-23T13:02:55Z"), o1);
orderRepository.save(o1);
paymentRepository.save(p1);
它的唯一工作方式如下:

Order o1 = new Order(null, Instant.parse("2019-06-20T19:53:07Z"));
Payment p1 = new Payment(null, Instant.parse("2019-06-23T13:02:55Z"), o1);
o1.setPayment(p1);
orderRepository.save(o1);
paymentRepository.save(p1);

我想了解为什么只有最后一种方法有效。在多对一关联中,为了工作,我不必在保存之前设置双向关联。在这个案例中,我遗漏了什么?谢谢。

因为我们必须为父实体设置子实体,就像您使用
o1.setPayment(p1)

无需将id传递为null,因为它将
@GeneratedValue
。您可能需要为它们创建适当的构造函数

当您使用
cascade=CascadeType时,您可以保存父级和子级
如下所示,两个实体都不需要使用save()

试试这个

Order o1 = new Order(null, Instant.parse("2019-06-20T19:53:07Z"));
Payment p1 = new Payment(null, Instant.parse("2019-06-23T13:02:55Z"), o1);
o1.setPayment(p1);
orderRepository.save(o1);
不需要保存付款方式。因为您在保存订单时使用了级联类型,如
@OneToOne(cascade=CascadeType.ALL,mappedBy=“order”)
,因此也保存了付款