gpt4 book ai didi

java - 版本字段打破了持久层上的 orphanRemoval 行为

转载 作者:行者123 更新时间:2023-11-30 10:25:01 26 4
gpt4 key购买 nike

我有实体 Event 与另一个实体有特定关系:

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "event")
private Set<Reminder> reminders = new HashSet<>();

在我将版本列添加到 Event 实体之前,一切都运行良好(包含测试,检查了最重要的案例)。

@Column(name = "version_num")
@Version
private long version;

添加 version 后声明 orphanRemoval 不再工作(测试显示给我)。

    saveDefaultEventAndCalendar();
event.setReminders(Collections.emptySet());

eventRepository.save(event);

Event actualEvent = eventRepository.findOneByCalendarIdAndId(calendar.getId(), event.getId());
assertThat(actualEvent, equalTo(event));
assertThat(actualEvent.getReminders().size(), equalTo(0));

List<Reminder> reminders = reminderRepository.findAll();
assertThat(reminders.size(), equalTo(0));

最后一行断言被打破,因为 reminders 在数据库中(reminders 链接到 actualEventactualEvent 不再有链接)。

如果可能的话,我希望对这种行为的帮助进行解释。

最佳答案

简单回答:

entityManager.flush();

详细答案:

解决方案的总体思路是使用新注入(inject)的 entityManager 推送级联更改,直到事务未关闭(如果相关的特殊属性注释,则级联更改 hibernate 使用)。

...
@PersistenceContext
private EntityManager entityManager;
...

@Test
public void save() {
saveDefaultEventAndCalendarFullyInitialized();
event1ForCalendar1.setReminders(Collections.emptySet());

eventRepository.save(event1ForCalendar1);
entityManager.flush();

Event actualEvent = eventRepository.findOneByCalendarIdAndId(calendar1.getId(), event1ForCalendar1.getId());

event1ForCalendar1.setVersion(event1ForCalendar1.getVersion() + 1);
assertThat(actualEvent, equalTo(event1ForCalendar1));
assertThat(actualEvent.getReminders().size(), equalTo(0));

List<Reminder> reminders = reminderRepository.findAll();
assertThat(reminders.size(), equalTo(0));
}

关于java - 版本字段打破了持久层上的 orphanRemoval 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46424848/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com