java - 返回更新的实体后出现 LazyInitializationException

标签 java hibernate jpa spring-data-jpa

我有一些具有两种关系的模型:

@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 字段填写不正确?

最佳答案

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

引用here了解更多详情。

关于java - 返回更新的实体后出现 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61577561/

相关文章:

hibernate - 使用接口(interface)覆盖 @Embedded 的 @ManyToOne targetEntity

java - Spring MVCOptionalValidatorFactoryBean 未找到

java - Comparator.comparing 使用嵌套对象的字段对列表进行排序

java - 是否可以从另一个应用程序(在单独的进程中启动)连接到 spring boot 嵌入式 ActiveMQ 实例?

java - 使用 Hibernate Criteria 的特定行的索引

java - Spring/JPA/Hibernate 持久实体 : Nothing happen

java - 无法添加或更新子行 : a foreign key constraint fails in hibernate

java - JPA - 用于测试的不同 id 生成策略

java - 为多个并发 SOAP 请求配置 Tomcat

java - 使用 jgrapht 创建带有簇的图