【问题标题】:Hibernate does not create proxy within @DataJpaTestHibernate 不会在 @DataJpaTest 中创建代理
【发布时间】:2021-11-27 02:01:43
【问题描述】:

我有一个非常简单的测试来测试在正常运行时可以正常工作的 spring 数据存储库。我真的不认为这样做应该这么难,但我不明白我做错了什么,请帮助。

当我尝试测试此存储库时,我开始收到类似以下内容的错误:

引起:org.hibernate.HibernateException:生成 HibernateProxy 实例在运行时是不允许配置的 BytecodeProvider 为“无”;您的模型需要更高级的 要启用的 BytecodeProvider。在 org.hibernate.bytecode.internal.none.DisallowedProxyFactory.getProxy(DisallowedProxyFactory.java:37) 在 org.hibernate.tuple.entity.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:746) 在 org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:5049)

hibernate 似乎无法为实体类创建代理,因为由于某种原因,它已为代理工厂分配了 DisallowedProxyFactory 实现。所以我添加了这个配置:

spring.jpa.properties.hibernate.enhancer.enableDirtyTracking=true spring.jpa.properties.hibernate.enhancer.enableLazyInitialization=true

但现在我只是收到了这个错误:

原因:java.lang.IllegalStateException:无法应用类 没有指定 LoadTimeWeaver 的变压器 org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.addTransformer(SpringPersistenceUnitInfo.java:83)

所以我在测试类中添加了@EnableLoadTimeWeaving,现在我收到了这个错误

原因:java.lang.IllegalStateException: ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader] 不提供 'addTransformer(ClassFileTransformer)' 方法。指定自定义 LoadTimeWeaver 或使用 Spring 的代理启动 Java 虚拟机: -javaagent:spring-instrument-{版本}.jar

初始测试设置:

@DataJpaTest
@Transactional
@Import({RdsPersistenceConfigration.class})
class DivisionRepositoryTest {

    @Autowired
    private DivisionRepository repository;


    @Test
    @Sql(scripts = "classpath:sql/division-repository-test.sql")
    void crudOperations() {
        // test case logic       
    }
}

部门实体:

@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "division")
public class Division {

    private transient static final int HASH_CODE = Division.class.hashCode();

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "division_name", nullable = false)
    private String divisionName;

    @OneToMany(mappedBy = "division", fetch = FetchType.LAZY)
    private Set<Branch> branches = new HashSet<>();

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "tenant_id", nullable = false)
    private Tenant tenant;

    public void setTenant(Tenant tenant) {
        if (tenant != null) {
            this.tenant = tenant;
            tenant.addDivision(this);
        } else {
            if (this.tenant != null) this.tenant.removeDivision(this);
            this.tenant = tenant;
        }
    }

    @Transient
    public void addBranch(Branch branch) {
        if (branch != null) {
            if (branch.getDivision() != this) {
                branch.getDivision().removeBranch(branch);
            }
            branches.add(branch);
        }
    }

    @Transient
    public void removeBranch(Branch branch) {
        if (branch != null) {
            branches.remove(branch);
        }
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Division division = (Division) o;
        return Objects.equals(id, division.id);
    }

    @Override
    public int hashCode() {
        return Division.HASH_CODE;
    }

}

存储库:

public interface DivisionRepository extends JpaRepository<Division, Integer> {

    Page<Division> findAll(Pageable pageable);

}

Rds Persistence 配置类

@Configuration
@PropertySource("classpath:application-liquibase.properties")
@EntityScan("com.nflp.processingapplication.main.modules.persistence.sql")
public class RdsPersistenceConfigration {
}

根据@M 的建议更新了测试。丹尼姆

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

    @Autowired
    private DivisionRepository repository;

【问题讨论】:

  • 你有一个RdsPersistenceConfigration.class 的事实让我想知道里面有什么并且禁用(部分)自动配置。您也不应该导入该配置类(因为它会检测到 @SpringBootApplication 带注释的类并从那里开始工作)。
  • 谢谢@M.Deinum,我更新了我的答案,是的,你是对的,我最近才弄清楚春季启动测试中的“@ContextHierarchy”是如何工作的,并将更新我的测试来利用这个。我还进一步简化了这个测试,因为我认为我在这里不需要 RdsPersistenceConfiguration,但仍然收到相同的错误

标签: spring-boot hibernate spring-data-jpa spring-data


【解决方案1】:

好的,我终于找到了解决方案,原因是我什至没有怀疑,我的应用程序使用 spring native 来创建优化的生产构建,显然它以某种方式干预了应用程序的开发构建过程。现在,我刚刚从我的应用程序中删除了它。 稍后我可能会尝试将开发 build.gradle 与生产版本分开。

【讨论】:

    猜你喜欢
    • 2019-08-16
    • 2014-09-22
    • 1970-01-01
    • 2018-11-19
    • 2012-02-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多