【问题标题】:Avoid insert multiple row in one to one relationship避免在一对一关系中插入多行
【发布时间】:2019-07-05 12:59:15
【问题描述】:

我有一个旧实体和一个新实体,用于在不修改的情况下扩展旧实体。

@Entity
public class OldEntity extends AbstractAuditingEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @Column(name = "activation_date")
    @NotNull
    private Instant activationDate;

      @OneToOne(mappedBy = "oldentity", fetch = FetchType.LAZY)
    private NewEntity newEntity;

        // getters and setters
}

@Entity
public class NewEntity extends AbstractAuditingEntity implements Serializable  {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;


    @OneToOne(fetch = FetchType.LAZY)
    private OldEntity oldEntity;

// setters and getters

}

当我在 newEntity 表中插入一行时,没有问题。但是,如果我在调用 find 时尝试将表中的 2 行插入到 newEntity 中,我会得到正确的休眠异常“找到了多个具有给定标识符的行”。 是否可以避免使用标准休眠注释进行多次插入?

编辑插入新记录我使用这样的简单存储库

@Repository
public interface NewEntityRepository extends JpaRepository<NewRepository, Long> {

}

在服务中我打电话给

newEntityRepository.save()

【问题讨论】:

    标签: hibernate jpa annotations


    【解决方案1】:

    如果您从单独的事务中获取对象,并尝试保存它。然后你可以有这个异常。所以重点是交易!

    我的建议。 1。使用@Transaction 注解并将你的整个逻辑包装在这个方法中。

    @Trasactional
    public void saveMethod() {
       NewEntity entity = new NewEntity();
       entity.setSomething(something);
       newEntitryRepository.save(entity);
    
       entity = newEntitryRepository.findById(entity.getId()).get();
       // do some other logic..
       newEntitryRepository.save(entity);
    }
    

    2。或者您有复杂的业务逻辑,然后将@Transaction 添加到您调用的所有方法中。

    @Transactional
    public void saveMethod() {
        NewEntity entity = new NewEntity();
        entity.setSomething(something);
        newEntitryRepository.save(entity);
        saveMethodDetail();
    }
    
    
    @Transactional
    public void saveMethodDetail(NewEntity entity) {
       entity = newEntitryRepository.findById(entity.getId()).get();
       // do some other logic..
       newEntitryRepository.save(entity);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 2021-06-30
      • 2015-03-16
      • 2022-12-18
      相关资源
      最近更新 更多