NPE при доступе к полям LAZY коллекции при событиях удаления - PullRequest
0 голосов
/ 25 мая 2020

Версия гибернации: 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 .

...