我有与另一个实体具有指定关系的实体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
链接到reminders
但actualEvent
不再有链接),并且最后一行断言被打破了。
如果有可能的话,我希望能解释这种帮助修复行为。
答案 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
。