简体   繁体   English

返回更新实体后的 LazyInitializationException

[英]LazyInitializationException after return updated entity

I have some model with two relations:我有一些 model 有两个关系:

@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
}

I use Spring Data JPA and I want to update entity.我使用Spring Data JPA并且我想更新实体。 I write simple service:我写简单的服务:

@Service
public class DataModelService {

    @Autowired
    private DataModelRepository dataModelRepository;

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

    //another methods
}

I write simple test:我写了简单的测试:

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());
    }
}

But, I get error, when I try to call method getQieries() :但是,当我尝试调用方法getQieries()时出现错误:

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

In debug I see:在调试中我看到: 在此处输入图像描述

Questions:问题:

  1. Why does this error occur and how can I fix it?为什么会发生此错误,我该如何解决? How do I make hibernate return all links after an update?如何让 hibernate 在更新后返回所有链接?
  2. Why is the outputFields field filled in correctly, but the queries field is not?为什么outputFields字段填写正确,而queries字段填写不正确?

It happens because you are trying to initialize collection outside a transaction.发生这种情况是因为您试图在事务之外初始化集合。 To fix this add @DataJpaTest and @RunWith(SpringRunner.class) annotations to your test class.要解决此问题,请将@DataJpaTest@RunWith(SpringRunner.class)注释添加到您的测试 class。 By default, data JPA tests are transactional.默认情况下,数据 JPA 测试是事务性的。

Refer here for more details.有关详细信息,请参阅此处

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM