LazyInitializationException после возврата обновленной сущности - PullRequest
0 голосов
/ 03 мая 2020

У меня есть модель с двумя отношениями:

@Entity
@Table(name = "data_model")
public class DataModel {

    @Id
    @GeneratedValue
    @Column(name = "model_id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @OneToMany(mappedBy = "dataModel", cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE})
    private List<OutputField> outputFields;

    @OneToMany(mappedBy = "dataModel", cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE})
    private List<Query> queries;

    //some another fields
}

Я использую Spring Data JPA и хочу обновить сущность. Я пишу простой сервис:

@Service
public class DataModelService {

    @Autowired
    private DataModelRepository dataModelRepository;

    @Transactional
    public DataModel createOrUpdate(DataModel dataModel) {
       return dataModelRepository.save(dataModel);
    }

    //another methods
}

Я пишу простой тест:

public class DataModelServiceTest {
    @Autowired
    private DataModelService dataModelService;

    @Test
    void shouldUpdateDataModel() {
       DataModel dataModelBeforeUpdate = dataModelService.getById(1);
       dataModelBeforeUpdate.getQueries().get(0).setSqlQuery("SELECT 1");
       DataModel updatedModel = dataModelService.createOrUpdate(dataModelBeforeUpdate);
       assertThat(updatedModel.getQueries(), notNullValue());
    }
}

Но я получаю ошибку, когда пытаюсь вызвать метод getQieries():

Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.

В отладке я вижу: enter image description here

Вопросы:

  1. Почему возникает эта ошибка и как ее можно исправить? Как заставить hibernate возвращать все ссылки после обновления?
  2. Почему поле outputFields заполнено правильно, а поле queries нет?

1 Ответ

0 голосов
/ 04 мая 2020

Это происходит потому, что вы пытаетесь инициализировать сбор за пределами транзакции. Чтобы исправить это, добавьте аннотации @DataJpaTest и @RunWith(SpringRunner.class) в свой тестовый класс. По умолчанию данные JPA-тесты являются транзакционными.

Подробнее см. .

...