Java 版本字段中断了持久层上的删除行为
我有实体Java 版本字段中断了持久层上的删除行为,java,hibernate,junit,spring-data-jpa,Java,Hibernate,Junit,Spring Data Jpa,我有实体事件,与另一实体具有指定关系: @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "event") private Set<Reminder> reminders = new HashSet<>(); 添加版本后声明删除不再有效(测试向我显示) saveDefaultEventAndCalendar(); event.setmembers(Collections.empt
事件
,与另一实体具有指定关系:
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "event")
private Set<Reminder> reminders = new HashSet<>();
添加版本后
声明删除
不再有效(测试向我显示)
saveDefaultEventAndCalendar();
event.setmembers(Collections.emptySet());
eventRepository.save(事件);
Event-actualvent=eventRepository.findOneByCalendarIdAndId(calendar.getId(),Event.getId());
资产(实际、相等(事件));
断言(actualEvent.GetEmlerments().size(),等于(0));
列表提醒=employerrepository.findAll();
断言(rementers.size(),等于(0));
最后一行断言被中断,因为提醒
在db中(提醒
链接到实际事件
但实际事件
不再有链接)
< P>我希望用FIX解释这个行为,如果可能的话。< /P> < P>如果你想“代码>提醒> <代码>的生命周期依赖于<代码>事件< /代码>,可以考虑使用<代码> @ EntEngult/<代码>代替<代码> @ OneToMany <代码> .< /P>简单回答: 详细答复: 解决方案的总体思路是使用新注入的
entityManager
推送级联更改,直到事务未关闭为止(级联更改hibernate在相关的特殊属性注释中使用)
。。。
@持久上下文
私人实体管理者实体管理者;
...
@试验
公共作废保存(){
saveDefaultEventAndCalendarFullyInitialized();
event1ForCalendar1.setmembers(Collections.emptySet());
eventRepository.save(event1ForCalendar1);
entityManager.flush();
Event-actualvent=eventRepository.findOneByCalendarIdAndId(calendar1.getId(),event1ForCalendar1.getId());
event1ForCalendar1.setVersion(event1ForCalendar1.getVersion()+1);
资产(实际价值,相等(事件1或价值1));
断言(actualEvent.GetEmlerments().size(),等于(0));
列表提醒=employerrepository.findAll();
断言(rementers.size(),等于(0));
}
还有一件事很重要。在调试模式下,它是一次又一次的传递,行为是不稳定的。这是另一种提供受限关系工具的方法(在我的案例中也是如此)。我看不出有什么理由对我有帮助。你能解释一下吗?
@Column(name = "version_num")
@Version
private long version;
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));
entityManager.flush();
...
@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));
}