Вопрос по one-to-many, jpa, java, hibernate, lazy-loading – Коллекции JPA Hibernate не загружаются

0

У меня есть настройки JPA таким образом, что, если я не использую отложенную загрузку, будет загружена почти вся база данных. Я также использую сериализацию непосредственно на моделях, поэтому иногда мне нужно инициализировать прокси.

Я только хочу использовать ленивую нагрузку на коллекции. Тот факт, что некоторые особые объекты извлекаются с нетерпением, работает просто отлично. Но независимо от того, как я пытаюсь настроить коллекции, я никогда не получаю коллекцию прокси, я всегда получаю полностью загруженную коллекцию.

Это пример кода:

@Entity
public class Thread implements Externalizable {
    @OneToMany(mappedBy = "parentThread", fetch = FetchType.LAZY)
    public List getReplies() {
        return replies;
    }

Итак, проблема здесь в том, что когда я проверяю отладчик, список ответов persistantBag всегда заполняется информацией и является фактическими объектами Reply вместо пустых прокси, которые я хочу.

Я использую entityManager.find (Thread.class, "Я БЫ") когда я хочу поток и все подобные коллекции всегда загружаются независимо от того, есть у меня fetch = FetchType.LAZY или нет.

Насколько я понимаю, установка fetchtype lazy должна работать так, как я хочу. Также я бы хотел, чтобы при использовании thread.getReplies () загружались сущности, чтобы я мог сериализовать их и отправить их клиенту. Я не знаю, будет ли getReplies работать с прокси-объектами, так как мне никогда не удавалось загружать какую-либо коллекцию.

На стороне не я использую Intellij и использовал его для настройки JPA с Hibernate. Я также задал похожий вопрос, где я хочу, чтобы коллекция была полностью пустой, но я не уверен, возможно ли это, и поэтому я задаю этот вопрос вместо этого.

JPA Hibernate хочет ленивую загрузку, чтобы вернуть пустую коллекцию

Я еще не видел хорошего ответа на этот, казалось бы, основной вопрос по stackoverflow. Пожалуйста, отвечайте только со ссылкой, если на вопрос действительно ответили педагогическим путем, так как я новичок в JPA / Hibernate и на самом деле базы данных.

Заранее большое спасибо!

Ваш Ответ

1   ответ
3

бой загруженную ленту. Это означает, что когда вы получаете поток из базы данных, его список ответов выигралбыть инициализированным.

призваниеgetReplies() просто вернет этот неинициализированный список. Только при вызове метода в самом списке (например,size() или жеiterator()) Hibernate инициализирует список, выполняя SQL-запрос, загружающий состояние всех ответов потока.

Использование отладчика для проверки того, что содержит коллекция, не является хорошей идеей, потому что отладчик обычно вызывает методы в списке за вашей спиной, что приводит к инициализации списка. Вы можете проверить, инициализирована ли коллекция, используяHibernate.isInitialized(thread.getReplies()) метод.

Относительно вашего другого вопроса: Hibernate используется для сопоставления строк базы данных с объектами. Если у потока есть ответы, Hibernate никогда не скажет вам, чтоне вернуть, вернув вам пустой список. Это было бы серьезной ошибкой. Если вы нене хочу загружать ответы, просто неВызвать любой метод из списка ответов.

Спасибо! И извините за то, что забыли принять ваш ответ =) Я пропустил, что отладчик действительно вызывает методы за моей спиной, что вызвало мое замешательство. Mathias Lindblom

Похожие вопросы