java - Spring 数据JPA : one-to-one instantiation problem: PersistentObjectException: detached entity passed to persist

标签 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")
    private Payment payment;

支付类相关代码:

@Entity
public class Payment implements Serializable {

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

    @OneToOne
    @MapsId 
    private Order order;

然后我想实现一个基本方法来使用 Spring Data JPA 存储库为我的测试数据库提供种子,但是如果我尝试以下代码,我会得到一个 PersistentObjectException ,表示 分离的实体已传递到持久化:

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 传递,因为它将是 @GenerateValue。您可能必须为它们创建适当的构造函数。

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

//save Parent-Child at same 
        @PostMapping(value = "/onetoone")
        public String OneToOne(@RequestBody ParentOne parent)
        {
            ChildOne childOne = parent.getChildOne();
            childOne.setParentOne(parent);
            parent.setChildOne(childOne);
            parentOneRepository.save(parent);
            return "saved";

            /*{
                "parentName":"Parent Name",
                "childOne":{
                    "childName":"Child Name"
                }
            }*/
        }

Discussion

关于java - Spring 数据JPA : one-to-one instantiation problem: PersistentObjectException: detached entity passed to persist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57315805/

相关文章:

sql - JPQL IN 子句 : Java-Arrays (or Lists, 设置...)?

java - 如何使用 REST 和 JPA/Hibernate 正确更新实体

ssl - Springboot 2.0 https 启用 CA 的 SSL 证书

java - 如何在springframework中查找注解的文档

spring - 将 .crt 添加到 Spring Boot 以启用 SSL

java - 为什么 EntityManager createNativeQuery 列表有时返回 BigDecimal 而有时返回 Integer?

java - 尝试多维数组,在线程 "main"java.lang.ArrayIndexOutOfBoundsException 中收到异常

java - 在antlr语法g4文件中使用Java代码

java - 当我中断线程时,有什么办法可以在 sleep 后立即执行语句

java - 如何在 Google App Engine 的 ManyToOne 端按 parent 过滤实体