【问题标题】:Detached entity passed to persist when saving保存时传递的分离实体持续存在
【发布时间】:2020-04-14 09:40:20
【问题描述】:

我有一些代码,但它在 personRepository.save(person2) 处出现错误,无需修复此问题,只需向我解释为什么会抛出此错误:分离的实体传递给持久化。

  @Entity
    public class Person {

        @Id
        @GeneratedValue
        @Column(name = "id")
        private Long id;

        @Column(name = "name")
        private String name;

        @Column(name = "wallet_id", insertable = false, updatable = false)
        private Long wallet_id;

        @ManyToOne  (fetch = FetchType.LAZY, cascade = CascadeType.ALL)
        @JoinColumn(name = "wallet_id",referencedColumnName = "id", insertable = true, updatable = true )
        private Wallet wallet;
    }




    public void testSave(String name) {
            Wallet walletNewNoHaveInDB = new Wallet(); // Generated id.

            Person person = new Person(); // Generated id.
            person.setName(name);
            person.setWallet(walletNewNoHaveInDB);
            personRepository.save(person); // This is OK and inserted into DB both(wallet , person).

            Person person2 = new Person(); // Generated id.
            person2.setName(name);
            person2.setWallet(walletNewNoHaveInDB);
            personRepository.save(person2); /// detached entity passed to persist
      }

【问题讨论】:

    标签: java hibernate jpa entitymanager


    【解决方案1】:

    我了解您没有使用 @Transactional 注释您的测试 - 在这种情况下,spring 正在为您创建事务以执行您所称的“保存”。更多信息在这里:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions

    在第一种情况下,您拥有“新”对象(没有 ID,并且不受 JPA 提供者管理),并且您确实指定了级联,因此 JPA 提供者知道如何将其保存在 1 个事务中。

    在第二种情况下,您添加的钱包已经是托管对象,但没有交易。

    您要么需要在 @Transactional 范围内完成所有操作(注释您的测试),要么如果您从事务“外部”传递对象(这是您的场景),再次......您需要有一个事务 - 所以您需要启动它并对来自它外部的对象调用 merge()。

    【讨论】:

      猜你喜欢
      • 2016-06-27
      • 2016-10-29
      • 2015-02-24
      • 2022-09-22
      • 2020-09-28
      • 2016-11-25
      • 2021-01-03
      • 1970-01-01
      相关资源
      最近更新 更多