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

标签 java spring hibernate jpa spring-data-jpa

最重要的结构描述:

在我的应用程序中使用了 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

现在可以了,但我不喜欢这种方式。

问题:

  1. 这是我的架构问题吗?
  2. 是否是 hibernate 问题?
  3. 应该如何配置而不需要多余的调用 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/

相关文章:

java - 为什么 Lombok @Wither 不起作用

java - 在这种情况下对象会被收集吗?

java - 如何使用java 10连接到MySQL8.x数据库?

spring - Thymeleaf 和 Spring MVC 当前 Controller 和 Action

Hibernate @OneToMany和UNIQUE约束

java - Hibernate - 加载子项

java - 在java中对集合进行排序

java - AngularJS 在每次请求时从 Controller 中检索用户对象

java - 在 Spring MVC Controller 中选择 JsonView

java - @Id 注释在 Hibernate 和 Oracle 中不起作用