You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate在@DataJpaTest测试中无法创建代理系列报错问题求助

解决方案

第一步:回滚所有额外添加的非必要配置

  • 移除配置文件中你手动添加的两行Hibernate增强配置:
# 以下两行配置完全删除即可
spring.jpa.properties.hibernate.enhancer.enableDirtyTracking=true
spring.jpa.properties.hibernate.enhancer.enableLazyInitialization=true
  • 移除测试类或配置类上的@EnableLoadTimeWeaving注解,普通JPA懒加载场景不需要用到加载时织入能力。

第二步:确认测试配置符合@DataJpaTest的使用规范

@DataJpaTest本身已经自带了完整的JPA组件自动配置,你之前手动@Import自定义的RdsPersistenceConfigration覆盖了默认的BytecodeProvider配置,才导致代理生成能力被关闭。你已经参考建议移除了@Import,最终测试类配置如下即可正常运行:

@DataJpaTest
@Transactional
@TestPropertySource(properties = "spring.liquibase.change-log=classpath:db/changelog/changelog.master.xml")
class DivisionRepositoryTest {

    @Autowired
    private DivisionRepository repository;

    @Test
    @Sql(scripts = "classpath:sql/division-repository-test.sql")
    void crudOperations() {
        // 测试逻辑
    }
}

可选修复方案(回滚后仍报错时使用)

如果完成上述两步后仍出现最初的HibernateProxy生成错误,可以给实体类的懒加载关联明确指定目标实体类型,避免Hibernate反射推断类型失败:

// 修正@OneToMany注解
@OneToMany(mappedBy = "division", fetch = FetchType.LAZY, targetEntity = Branch.class)
private Set<Branch> branches = new HashSet<>();

// 修正@ManyToOne注解
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Tenant.class)
@JoinColumn(name = "tenant_id", nullable = false)
private Tenant tenant;

错误原理说明

Hibernate默认的运行时代理能力已经可以支持普通的懒加载需求,不需要额外开启字节码增强和加载时织入。你之前的错误配置主动开启了字节码增强,才触发了后续一系列LoadTimeWeaver相关报错。@DataJpaTest默认已经配置好了适配测试环境的Hibernate BytecodeProvider,不需要自定义JPA配置覆盖默认行为。

内容的提问来源于stack exchange,提问作者Dmytro Kostyushko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:54:02