繁体   English   中英

返回更新实体后的 LazyInitializationException

[英]LazyInitializationException after return updated entity

我有一些 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
}

我使用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.

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

问题:

  1. 为什么会发生此错误,我该如何解决? 如何让 hibernate 在更新后返回所有链接?
  2. 为什么outputFields字段填写正确,而queries字段填写不正确?

发生这种情况是因为您试图在事务之外初始化集合。 要解决此问题,请将@DataJpaTest@RunWith(SpringRunner.class)注释添加到您的测试 class。 默认情况下,数据 JPA 测试是事务性的。

有关详细信息,请参阅此处

暂无
暂无

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

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