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

时间:2017-05-17 10:58:12

标签: java spring hibernate jpa spring-data-jpa

最重要的结构描述:

在我的应用程序中使用的是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。似乎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());
  4. ,应如何配置

1 个答案:

答案 0 :(得分:1)

尝试切换到JpaRepository并使用

eventRepository.saveAndFlush(event);

而不是eventRepository.save(event)

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

它将强制repo刷新对数据库的所有挂起更改。

同时检查您的repo界面上是否设置了@Transactional(readOnly = true),以便将{1> reference或MANUAL中所描述的刷新模式设置为here){{1} }} 方法。也许这就是问题......