最重要的结构描述:
在我的应用程序中使用了 Spring data 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
的人都应该清楚这一点。
我已经实现了保存事件
的测试,因为结果依赖的参加者
集合也保存了(由于最开始显示的对应关系设置而使用了 hibernate 魔法。)
eventRepository.save(event);
提供保存|更新事件并用新的嵌套与会者替换所有旧的嵌套与会者。
问题描述:
有时我需要在保存事件的同一事务中使用额外的处理程序。他们还使用存储库:
// 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:对象引用未保存的 transient 实例 - 在刷新之前保存 transient 实例: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
现在可以了,但我不喜欢这种方式。
问题:
- 这是我的架构问题吗?
- 是否是 hibernate 问题?
- 应该如何配置而不需要多余的调用
attendeeRepository.save(event.getAttendees());
?
最佳答案
尝试切换到JpaRepository并使用
eventRepository.saveAndFlush(event);
而不是eventRepository.save(event)
。
或者
eventRepository.save(event);
eventRepository.flush();
它将强制存储库刷新数据库中所有挂起的更改。
<小时/>还要检查您是否在存储库界面上设置了 @Transactional(readOnly = true)
将刷新模式设置为 NEVER(如 reference 中所述,或如 here 中所述的 MANUAL)也适用于 save
方法。也许这就是问题所在......
关于java - Spring 数据 JPA。级联更新仅适用于特殊情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44022927/