当前位置: 首页 > 知识库问答 >
问题:

Spring Data JPA:一对一实例化问题:PersistentObjectException:已分离的实体传递到Persister

督辉
2023-03-14

我在写一个简单的订单-付款一对一关联:

@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表示Detached entity Pass to 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);

我想明白为什么只有最后一种方法有效。在多对一关联中,我不必在保存之前设置双向关联,以便工作。我在这个案例中遗漏了什么关于超脱实体的行为?多谢了。

共有1个答案

王念
2023-03-14

因为我们必须为父实体设置子实体,就像您使用O1.setPayment(p1);所做的那样

不需要将id作为null传递,因为它将是@generatedvalue。您可能必须为它们创建适当的构造函数。

当您正在使用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"
                }
            }*/
        }

讨论

 类似资料:
  • 我在尝试使用Spring Data JPA和Hibernate作为JPA提供程序执行批插入操作时遇到了问题。 我有以下方法在我的服务。这就是抛出异常的地方。 Institute是一个实例变量,并提前获取。 我还将实体设置为级联、持久和合并。 为什么这段代码起作用 而此代码不

  • 我在stackoverflow上读了很多关于相同异常的文章,但没有找到任何实际帮助我的东西,所以我在这里:

  • 另外,我有一个IOC托管bean,它内部有一个事务方法。 有2个实体具有单向Many2One-- AuModule在上没有引用

  • 初始数据。专业有很多科目。 专业JAVA 对于一个主题来说,专业不能为空。我希望它能以下一种方式工作:当我保存/更新/分离一个主题时,同样的操作必须应用于专业。当我删除一个主题时,专业不会发生任何变化。 主题JAVA 我写了一个集成测试。生成专业()和生成主题()这只是util方法。 你可以在这张图片上看到测试结果。 subjectService在此处引发了异常。保存(主题1); 原因:org。冬

  • 我有一个JPA持久化的对象模型,它包含多对一的关系:一个有许多。一个有一个。 下面是代码片段: 我能够创建对象,向其添加事务,并正确地持久化对象。但是,当我创建一个事务,使用一个现有的已经持久化的帐户,并持久化该事务时,我会得到一个异常: 原因:org.hibernate.PersistentObjectException:已分离的实体传递给Persist:com.PaulSanwald.Acco

  • 我编写了第一个java应用程序来读取rss流,并使用,,。我的模特<代码>RssFeed: : 和: 我使用处理数据。如果不使用多对多功能保存RssFeed,则可以: 但当我加上一句话: 获取异常:。 我的RssFeedServiceImpl: } 和RssCategoryServiceImpl: 拯救多少对多少?