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
相关产品推荐
相关产品推荐

