Version字段断开持久层上的orphanRemoval行为

时间:2017-09-26 11:09:44

标签: java hibernate junit spring-data-jpa

我有与另一个实体具有指定关系的实体public class DetailList { public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } public string Country { get; set; } } Collection<DetailList> list = new Collection<DetailList>();

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)); 在db(reminders链接到remindersactualEvent不再有链接),

并且最后一行断言被打破了。

如果有可能的话,我希望能解释这种帮助修复行为。

2 个答案:

答案 0 :(得分:1)

简单回答:

entityManager.flush();

详细答案:

解决方案的一般思路是推动级联更改,直到使用新注入的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));
}

答案 1 :(得分:0)

如果您希望let dir = (parameters.count >= 1 && parameters[0] as? direction != nil) ? parameters[0] as! direction : defaultDirection 的生命周期取决于reminder,可以考虑使用event代替@ElementCollection