gpt4 book ai didi

java - 如何使用延迟初始化? [延迟初始化异常]

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

要获取惰性对象,您需要调用 Hibernate.initialize(proxy) 例如在您的服务类别中:

public <R> R fetchLazy(T entity, Function<T,R> proxyMapper) {
entity = ensureEntityHasOpenedSession(entity);
R proxy = proxyMapper.apply(entity);
Hibernate.initialize(proxy);
return proxy;
}

在服务范围之外需要调用:

AnotherEntity another = service.fetchLazy(entity, Entity::getAnotherEntity);

现在的问题是为什么它会起作用:

another.getId();

而后续调用不会:

entity.getAnotherEntity().getId(); // LazyInitializationException

第一次获取后,AnotherEntity 是否已存储在 Entity 中?我是否总是需要打电话

service.fetchLazy(entity, Entity::getAnotherEntity).getSomething(); 

如果是这样,Hibernate.initialize(Object) 是否会在第二次调用时返回缓存的代理,或者始终存在另一个数据库访问(查询执行)?

编辑

我在私有(private)类字段上结合使用 JPA 注释 lombok@Getter @Setter注释。

最佳答案

您可能正在使用 JPA 字段访问,即您注释了实体类的 Java 字段而不是 getter。这是 Hibernate 中字段访问的已知限制。避免异常或显式初始化的唯一方法是使用属性访问。

另请参阅以下 JIRA 问题以获取更多信息

关于java - 如何使用延迟初始化? [延迟初始化异常],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51118033/

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