我有一个旧实体和一个新实体,可以在不做任何修改的情况下扩展旧实体。
@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()
答案 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);
}