Версия гибернации: 5.4.10
Сущность:
@Entity
class Plan {
...
@ManyToOne(optional = false, fetch = LAZY)
@JoinColumn(name = "PRODUCT_ID", nullable = false)
private Product product;
@ElementCollection
@CollectionTable(name = "ACCOUNT_TYPES", joinColumns = @JoinColumn(name = "PLAN_ID", referencedColumnName = "ID"))
@Column(name = "TYPE", nullable = false)
@Enumerated(EnumType.STRING)
private Set<AccountType> accountTypes;
...
}
Пример теста:
@Test
public void hibernate() throws Exception {
UUID id = fromString("b80db28f-2e4f-4d18-bb96-6bc5b9b387cb");
EntityManager entityManager = entityManagerProvider.get();
ObjectMapper objectMapper = new ObjectMapper();
doAnswer(new Answer<Void>() {
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
EventEntity<?> entity = (EventEntity<?>) args[0];
objectMapper.writeValueAsString(entity);
return null;
}
}).when(eventPublisher).publish(any(EventEntity.class));
Plan plan = entityManager.find(Plan.class, id);
entityManager.remove(plan);
assertFalse(entityManager.contains(plan));
entityManager.flush();
verify(eventPublisher, times(1)).publish(any(EventEntity.class));
}
Я получаю NPE при вызове объекта сопоставления объектов Джексона entity.getList () внутри PreDeleteEventListener #onPreDelete
Caused by: java.lang.NullPointerException
at org.hibernate.collection.internal.AbstractPersistentCollection$1.doWork(AbstractPersistentCollection.java:170)
Таким образом, любое поле коллекции Laze
успешно извлекается только product , а не accountTypes причиной npe при доступе к коллекции.
Это странно из-за ожидаемого такого же поведения для ленивых полей.
Можно ли получить данные ElementCollection после операции удаления в случае Lazy?
Обходной путь:
Измените аннотацию на @ElementCollection(fetch = FetchType.EAGER)
, но это кажется неправильным, поскольку столбец соединения успешно извлекается с типом выборки LAZY .