避免在一对一关系中插入多行

时间:2019-07-05 12:59:15

标签: hibernate jpa annotations

我有一个旧实体和一个新实体,可以在不做任何修改的情况下扩展旧实体。

@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()

1 个答案:

答案 0 :(得分:0)

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

我的建议。 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);
}