gpt4 book ai didi

java - Mockito 参数匹配器和 hibernate 延迟初始化

转载 作者:行者123 更新时间:2023-12-02 02:01:18 57 4
gpt4 key购买 nike

我创建了以下捕获器:

public class CompanyOwnerMatcher extends ArgumentMatcher<CompanyOwner> {

private String uuid;

CompanyOwnerMatcher(String uuid) {
this.uuid = uuid;
}

@Override
public boolean matches(Object arg) {
if (!(arg instanceof CompanyOwner)) return false;
CompanyOwner owner = (CompanyOwner) arg;
return Objects.equals(uuid, owner.getUuid());
}
}

我在这段代码中遇到异常:

Mockito.verify(payInApi).submit(eq(1L), argThat(new CompanyOwnerMatcher(expectedOwnerUuid)));

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:148)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:266)

CompanyOwner 由 hibernate 管理。这很奇怪,但是在我捕获 CompanyOwner 后,我无法获取其上的任何字段值,因为我收到 LazyInitializationException,即使在未标记为 Lazy 的字段上也是如此。

非常感谢有关此问题的任何帮助。

谢谢!

最佳答案

我相信,Hibernate 创建了某种 CompanyOwner 代理。那么它实际上取决于代码,很可能当您调用匹配器时,对象已经从 Hibernate Session 分离。在这种情况下,当您尝试访问您提到的字段时,您将收到 LazyInitializationException

从所提供的代码片段中确实无法理解为什么 hibernate 决定用代理包装对象,我只能建议在 matches 方法中放置一个断点以确保这是确实是代理,但是您必须弄清楚创建此代理的原因。

如果您发现在这种情况下确实必须完成代理,那么最好的方法可能是将对象“重新附加”到 session 。异常应该会消失,但是您可能会看到 hibernate 在这种情况下发出数据库请求。

您可能还对 This thread 感兴趣

关于java - Mockito 参数匹配器和 hibernate 延迟初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57373287/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com