gpt4 book ai didi

java - Dropwizard-Hibernate 文档想表达什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:15:04 26 4
gpt4 key购买 nike

我遇到了LazyInitializationException然后我遇到了官方doc的以下段落.不幸的是,这对我来说完全没有意义。请帮忙。

(文档中段落上方的代码块。)

@GET
@Timed
@UnitOfWork
public Person findPerson(@PathParam("id") LongParam id) {
return dao.findById(id.get());
}

Important

The Hibernate session is closed before your resource method’s return value (e.g., the Person from the database), which means your resource method (or DAO) is responsible for initializing all lazily-loaded collections, etc., before returning. Otherwise, you’ll get a LazyInitializationException thrown in your template (or null values produced by Jackson).

首先 Hibernate session 在资源方法的返回值之前关闭。这怎么可能?如果在我的资源的返回语句周围有一个 try-finally block ,这是可能的,但这里不是这种情况。

我的资源应该由另一个方法调用,我猜这会在我的资源方法被调用之前打开 Hibernate session ,然后在我的资源方法返回后关闭 session 。它如何在我的方法返回之前关闭它。我不明白。

最重要的部分 - 这意味着您的资源方法(或 DAO)负责在返回之前初始化所有延迟加载的集合等。 我没有 Hibernate 经验。我现在是第一次使用它。我如何初始化,或者更确切地说,在 Hibernate 上下文中“初始化”到底是什么意思?代码示例会有很大帮助。

PS:这个问题可能看起来很奇怪,粗略看一眼的人甚至会建议将其移至“English Language and Usage”,但请仔细阅读。这是一个技术问题,不是段落分解。

编辑:添加了文档中的代码块,否则任何人都没有意义。我还从我的问题中删除了一段,我在发布问题后立即清楚了这一点。

最佳答案

First The Hibernate session is closed before your resource method’s return value. How is this possible? This would have been possible had there been a try-finally block around my resource's return statement, but that is not the case here.

我对 Dropwizard 一无所知。所以让我们看看来源(我稍微改变了一下)。

来自 UnitOfWorkAwareProxyFactory

class UnitOfWorkAwareProxyFactory {

public <T> T create(Class<T> clazz) {
final ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(clazz);

final Proxy proxy = (Proxy) factory.createClass().newInstance();

proxy.setHandler(new MethodHandler() {
@Override
public Object invoke(Object self, Method overridden,
Method proceed, Object[] args) {
final UnitOfWork unitOfWork = overridden.getAnnotation(UnitOfWork.class);
final UnitOfWorkAspect unitOfWorkAspect = new UnitOfWorkAspect(sessionFactories);
try {
unitOfWorkAspect.beforeStart(unitOfWork);
Object result = proceed.invoke(self, args);
unitOfWorkAspect.afterEnd();
return result;
} catch (Exception e) {
unitOfWorkAspect.onError();
throw e;
}
}
});
return (T) proxy;
}

}

如果你有课

class PersonDao {

@UnitOfWork
public Person findPerson(LongParam id) {
return dao.findById(id.get());
}

}

你可以这样做

UnitOfWorkAwareProxyFactory factory = new UnitOfWorkAwareProxyFactory();

PersonDao proxy = factory.create(PersonDao.class);

当你这样做的时候

Person person = proxy.findPerson(1L);

那条线变成了

unitOfWorkAspect.beforeStart(unitOfWork);
Object result = findPerson.invoke(proxy, 1L);
unitOfWorkAspect.afterEnd();

return result;

方法 unitOfWorkAspect.beforeStart(unitOfWork)unitOfWorkAspect.afterEnd() 来自源 UnitOfWorkAspect

class UnitOfWorkAspect {

public void beforeStart(UnitOfWork unitOfWork) {
session = sessionFactory.openSession();

configureSession();
beginTransaction();
}

public void afterEnd() {
try {
commitTransaction();
} catch (Exception e) {
rollbackTransaction();
throw e;
} finally {
session.close();
}

}
}

The most important part - which means your resource method (or DAO) is responsible for initializing all lazily-loaded collections, etc., before returning. I have no Hibernate experience. I am using it for the first time now. How do I initialize, or rather what is exactly is meant by "initialize" in context of Hibernate?

在此上下文中初始化意味着集合数据应该从数据库加载。初始化的一些方法

1.使用预加载,例如

class User {

@ManyToMany(fetch = FetchType.EAGER)
private List<Role> roles;

}

当您获得User 实体时,Hibernate 将通过连接或子选择加载角色

  1. 使用 Hibernate.initialize(user.getRoles())
  2. 在 HQL 中使用 join fetchfrom User user left join fetch user.roles
  3. 使用 CriteriasetFetchMode()
  4. 使用获取配置文件、实体图。不知道实体图是否可以与 session 一起使用,这是一个 JPA 功能:http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/fetching/Fetching.html
  5. 如果不需要获取集合,可以使用部分对象加载并转换为根实体:How to transform a flat result set using Hibernate

关于java - Dropwizard-Hibernate 文档想表达什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37013540/

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