[英]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
现在可以使用,但是我不喜欢这种方式。
attendeeRepository.save(event.getAttendees());
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.