在我的应用程序中使用的是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
现在有效,但我不喜欢这种方式。
attendeeRepository.save(event.getAttendees());
?答案 0 :(得分:1)