Как заставить Initialize JPA-прокси Hibernate использовать его в вызове JSON - PullRequest
8 голосов
/ 13 января 2011

У меня есть приложение Spring 3 + JPA 2.0. В моем @Controller мне нужен инициализированный объект, но у меня есть прокси, мне нужно иметь возможность инициализировать его программно. Мне нужна функциональность, аналогичная org.hibernate.Hibernate.initialize(Object).

Может кто-нибудь помочь. Объект используется для операций AJAX. Если свойства являются прокси, я не могу отправить его как JSON

Ответы [ 3 ]

4 голосов
/ 13 января 2011

Нет опций JPA, насколько мне известно. Вы должны использовать Hibernate.initialize(..).

На самом деле, когда я взглянул на реализацию в спящем режиме, ленивые коллекции, похоже, были инициализированы во многих случаях, чего не ожидали. Как entityManager.contains(..) и Persistence.getPersistenceUtil().isLoaded(...). Попробуйте, но я не думаю, что вы должны полагаться на такие детали реализации.

1 голос
/ 25 января 2011

Мы делаем аналогичную вещь в нашем приложении, и мы сочли полезным разделить наши объекты сущностей базы данных и получить еще одну группу классов для вывода JSON.

Если вы используете инфраструктуру JSON, котораяпросто проверяет ваш объект и отбирает некоторый JSON для каждого свойства объекта, а затем может иметь такие объекты, как:

PersonEntity - класс, управляемый JPA и PersonJsonOutput - класс, специально разработанный для вывода JSON

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

Это также даетВы больше контролируете свой вывод JSON с точки зрения, скажем, форматов даты или превращения чисел в базе данных в строки в вашем JSON и т. д. ...

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

0 голосов
/ 29 июня 2015

Я знаю, что уже поздно, и ответ принят, но другой стандартный способ JPA - вызвать метод size () в списке, который вы хотите инициализировать, перед возвратом объекта из DAO:

Object.getList().size(); 

Это избавляет вас от мошенничества и использования специфичного для реализации механизма инициализации

...