Java Spring数据JPA。级联更新仅适用于特殊情况 最重要的结构描述:
在我的应用程序中使用的是Spring数据JPA。 我的应用程序中有一个模型部件:Java Spring数据JPA。级联更新仅适用于特殊情况 最重要的结构描述:,java,spring,hibernate,jpa,spring-data-jpa,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&g
@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;
// ...
}
提供保存|更新事件,并用新的嵌套与会者替换所有旧的嵌套与会者
问题描述:
有时我需要在保存事件的同一事务中使用其他处理程序。他们还使用存储库:
// 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.transientObject异常:对象引用未保存的临时实例-在刷新之前保存临时实例: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
现在可以了,但我不喜欢这种方式
问题:
尝试切换到JpaRepository并使用
eventRepository.saveAndFlush(event);
而不是eventRepository.save(event)
或
它将强制repo刷新数据库中所有挂起的更改
此外,还应检查您是否在回购界面上设置了
@Transactional(readOnly=true)
,以使保存方法的刷新模式变为从不(如中所述,或如手册所述)。也许这就是问题所在…没有尝试使用eventRepository.saveAndFlush(event)
(来自JpaRepository)?不,我没有这样做是因为spring jpa存储库,例如:org.springframework.data.repository.paging和sortingrepository
,org.springframework.data.jpa.repository.JpaRepository
不提供saveAndFlush
防止替换分页和排序存储的内容从ry到JpaRepository?会有什么帮助?
eventRepository.saveAndFlush(event);
eventRepository.save(event);
eventRepository.flush();