繁体   English   中英

春季数据JPA。 级联更新仅适用于特殊情况

[英]Spring data JPA. Cascade update works for special cases only

最重要的结构描述:

在我的应用程序中使用的是Spring数据JPA。 我的应用程序中有一个模型部分:

@Entity
public class Event implements Identifiable {
  // ...
  @OneToMany(cascade = CascadeType.ALL, mappedBy = "event", orphanRemoval = true)
  @OrderColumn(name = "order_index")
  private List<Attendee> attendees = new ArrayList<>();
  // ...
}

@Entity
public class Attendee implements Identifiable {
  // ...
  @ManyToOne
  @JoinColumn(columnDefinition = "event_id")
  private Event event;
  // ...
}

对于所有了解JPA人来说应该很清楚。

我已经实现了保存event测试,因为结果相关的attendees集合也可以保存(由于一开始就显示了对应关系设置,所以使用了休眠魔术)。

eventRepository.save(event);

提供save | update事件,并用新参与者替换所有旧的嵌套参与者。

问题描述:

有时我需要在具有保存事件的同一事务中使用其他处理程序。 他们还使用存储库:

// transaction starts... some handlers are used
eventRepository.save(event);
// some additional handlers2 are used
// transaction ends

如果handlers2包含任何具有独立实体的存储库操作,例如:

profileRepository.findAll();
// or
profileRepository.findByEmail("anyEmail");

,它会失败,并出现异常org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.nextiva.calendar.entity.Attendee 似乎应该保存与会者集合,因为没有保存。

为了解决这个问题,我使用了类似的解决方法:

// transaction starts... some handlers are used
attendeeRepository.save(event.getAttendees());
eventRepository.save(event);
// some additional handlers2 are used
// transaction ends

现在可以使用,但是我不喜欢这种方式。

问题:

  1. 是我的建筑问题吗?
  2. 是冬眠问题吗?
  3. 如何配置它而无需冗余调用attendeeRepository.save(event.getAttendees());

尝试切换到JpaRepository并使用

eventRepository.saveAndFlush(event);

而不是eventRepository.save(event)

要么

eventRepository.save(event);
eventRepository.flush();

它将强制存储库将所有未完成的更改刷新到数据库。


另外,请检查您是否设置@Transactional(readOnly = true)的回购界面,打开冲洗模式,以NEVER(如描述的参考手册,或描述这里 )也save方法。 也许这就是问题所在...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM