Я новичок в JEE и недавно начал изучать Spring и Hibernate. Я пытаюсь разработать службу RESTful для отслеживания элементов с категориями. У меня есть ассоциация «многие-ко-многим» (один элемент может иметь много категорий, а одна категория может иметь много элементов), три таблицы: элемент, категория и таблица соединений item_category.Hibernate много-много ленивое исключение инициализации
Я использую сервер MySQL, Spring загрузки 1.3.1 и Hibernate 4.3
То, что я хочу сделать прямо сейчас, чтобы получить список элементов с категориями и категориями со списком элементов. Я написал для него все приложение с API и закончил с LazyInitializationException. Я пробовал много подходов, но это не помогло. (Я могу настроить тип EACHER, но это не решение).
, например, это API, чтобы перечислить все пункты: GET /api/item
и это выход: (! Не ожидается):
Вызванный: org.hibernate.LazyInitializationException: не удалось лениво> инициализировать коллекцию роли: 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.Финал] на org.hibernate.collection.int ernal.AbstractPersistentCollection.withTemporarySessionIfNeeded (AbstractPersistentCollection.java:214) ~ [hibernate-core-4.3.10.Final.jar: 4.3.10.Final] at org.hibernate.collection.internal.AbstractPersistentCollection.readSize (AbstractPersistentCollection.java: 155) ~ [hibernate-core-4.3.10.Final.jar: 4.3.10.Final] at org.hibernate.collection.internal.PersistentSet.size (PersistentSet.java:160) ~ [hibernate-core-4.3. 10.Final.jar: 4.3.10.Final] at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize (CollectionSerializer.java:101) ~ [jackson-databind-2.6.5.jar: 2.6. 5] at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize (CollectionSerializer.java:24) ~ [jackson-databind-2.6.5.jar: 2.6.5] at com.fasterxml.jackson. databind.ser.BeanPropertyWriter.serializeAsField (BeanPropertyWriter.java:693) ~ [jackson-da tabind-2.6.5.jar: 2.6.5] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields (BeanSerializerBase.java:675) ~ [jackson-databind-2.6.5.jar: 2.6. 5]
же ошибка, если вы пытаетесь получить все категории GET /api/category
или категории по идентификатору GET /api/category/1
Так вот мои вопросы:
- Как избавиться от LazyInitializationException? Как настроить hibernate для повторного открытия сеанса? Или я должен инициализировать сбор в слое DAO?
- Я читал о шаблоне DTO, я не совсем понимаю, что это такое, если я буду копать глубже здесь?
- Я заметил проблему, когда пытаюсь вставить данные в элементы. Он вставляет только в таблицу элементов, таблица соединений и категория пусты. Я вручную добавил данные в БД для тестирования
- Что вы думаете обо всем приложении? Что можно улучшить здесь или то, что следует избегать (если таковые имеются)
И, наконец, я загрузил полный проект здесь: https://gitlab.com/sksh/ItemList.git
В ресурсах вы можете найти дамп базы данных с некоторыми случайными данными.Обновите application.properties с действительными учетными данными db.
является 'public Category findByKey (String key)' в 'CategoryDaoImpl.java' метод, который вы пытаетесь назвать, который дает вам это исключение? –
@Rdx он бросает его везде, findById, listAll и т. Д. Он начал бросать, так как я добавил список элементов в категории. – costello
GET/api/category throws org.hibernate.LazyInitializationException: не удалось лениво инициализировать коллекцию роли: com.sk.itemlist.domain.Category.items, не удалось инициализировать прокси - нет сеанса и наоборот, если я попытаюсь извлечь все (GET/api/item), но в этом случае он не может инициализировать категории – costello