【发布时间】:2016-05-14 20:31:03
【问题描述】:
我是 JEE 的新手,最近开始学习 Spring 和 Hibernate。我正在尝试开发 RESTful 服务来跟踪带有类别的项目。我有多对多关联(一个项目可以有很多类别,一个类别可以有很多项目),三个表:项目、类别和连接表 item_category。
我正在使用 MySQL 服务器、Spring Boot 1.3.1 和 Hibernate 4.3
我现在要做的是获取带有类别的项目列表和带有项目列表的类别。我为此使用 API 编写了整个应用程序,并以 LazyInitializationException 告终。我尝试了很多方法,但没有帮助。 (我可以设置获取类型 EAGER 但这不是解决方案)。
例如,这是列出所有项目的 API:GET /api/item
这是输出:(不是预期的!):
原因:org.hibernate.LazyInitializationException: failed to lazily >初始化角色集合:com.sk.itemlist.domain.Item.categories,无法初始化代理 - 没有会话 在 org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:575) ~[hibernate-core-4.3.10.Final.jar:4.3.10.Final] 在 org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:214) ~[hibernate-core-4.3.10.Final.jar:4.3.10.Final] 在 org.hibernate.collection.internal.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:155) ~[hibernate-core-4.3.10.Final.jar:4.3.10.Final] 在 org.hibernate.collection.internal.PersistentSet.size(PersistentSet.java:160) ~[hibernate-core-4.3.10.Final.jar:4.3.10.Final] 在 com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:101) ~[jackson-databind-2.6.5.jar:2.6.5] 在 com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:24) ~[jackson-databind-2.6.5.jar:2.6.5] 在 com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693) ~[jackson-databind-2.6.5.jar:2.6.5] 在 com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675) ~[jackson-databind-2.6.5.jar:2.6.5]
如果您尝试获取所有类别 GET /api/category 或按 id GET /api/category/1 的类别,则会出现同样的错误
这是我的问题:
- 如何摆脱 LazyInitializationException?如何配置休眠以重新打开会话?还是应该在 DAO 层初始化集合?
- 我阅读了有关 DTO 模式的信息,但我不完全了解它是什么,我应该在这里深入挖掘吗?
- 我在尝试将数据插入项目时发现了问题。它只插入项目表,连接表和类别为空。我手动将数据添加到数据库中进行测试
- 您对整个应用的感觉如何?我可以在这里改进什么或应该避免什么(如果有的话)
最后,我在这里上传了完整的项目:https://gitlab.com/sksh/ItemList.git
在资源中,您可以找到包含一些随机数据的数据库转储。使用有效的数据库凭据更新 application.properties。
【问题讨论】:
-
是
public Category findByKey(String key)中的CategoryDaoImpl.java是您尝试调用的导致您出现此异常的方法吗? -
@Rdx 它把它扔到任何地方,findById,listAll 等等。自从我在 Category 中添加项目列表后,它就开始抛出了。
-
GET /api/category throws org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.sk.itemlist.domain.Category.items, 无法初始化代理 - 没有会话,反之亦然如果我尝试获取所有项目(GET /api/item),反之亦然,但在这种情况下,它无法初始化类别
标签: mysql hibernate spring-boot many-to-many lazy-initialization