- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我遇到了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 将通过连接或子选择加载角色
。
Hibernate.initialize(user.getRoles())
join fetch
— from User user left join fetch user.roles
Criteria
和 setFetchMode()
关于java - Dropwizard-Hibernate 文档想表达什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37013540/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!