2012-01-20 2 views
5

Я использую Hibernate с JPA и иметь отношения, которая выглядит так:JPA/Hibernate прокси не выборки данных реального объекта, устанавливает все свойства обнулить

public class PencilImpl implements Pencil { 

    @ManyToOne(targetEntity = PersonImpl.class, fetch = FetchType.LAZY) 
    @JoinColumn(name = "owner", nullable = false) 
    private Person owner; 

    ... 

    @Override 
    public final Person getOwner() { 
     return owner; 
    } 
} 

Так как я начал использовать ленивых типа выборки, каждый раз, когда я пытаюсь получить владельца карандаша (pencil.getOwner) Я получаю ненулевой объект, у которого все его внутренние свойства установлены равными нулю.

Похоже, что прокси-сервер, созданный Hibernate, не получает реальный объект из базы данных, когда это необходимо.

Любые идеи? Спасибо :)

+4

Вы вызываете геттеры и получаете нуль? Или вы проверяете объект в отладчике? Если первый, попробуйте удалить окончательный модификатор на своих геттерах. Если последний, попробуйте на самом деле вызвать геттеры. –

+0

См. Также http://blog.bolkey.com/2009/05/hibernate-datanucleus-r1/ – DataNucleus

ответ

2

Как предложил JB Nizet, то окончательного модификатора в добытчиках моих классов был баловаться с прокси зимует создает для ленивых загруженных отношений.

5

Это просто, как Hibernate реализует ленивую загрузку. Это даст вам прокси-объект вместо экземпляра вашего класса сущности. Когда вы говорите

ненулевым объект, который все его внутренние свойства, установленные в нуль

, что, вероятно, что вы видели в отладчике, верно? Вам не нужно беспокоиться об этом, как только вы получите доступ к любому из этих свойств с помощью кода или через вызов внутри отладчика, Hibernate загрузит данные из базы данных в фоновом режиме, построит экземпляр класса сущности и все вызовы прокси-объект будет делегирован прозрачно реальному объекту. Так обычно, и в идеале вам не нужно заботиться об отличии прокси-сервера Hibernate < -> объект объекта.

я могу думать о двух причинах, чтобы быть в курсе, что различия в любом случае:

  1. Performance: когда вы получаете доступ к элементам лениво загруженной коллекции в цикле, отложенная загрузка действительно может замедлить ваше приложение
  2. Наследование: если ваша модель данных использует наследование, будьте очень осторожны с instanceof и отливами. Читайте this SO question о том, как проверить, если объект является Hibernate прокси и как преобразовать его в объект реального объекта
+2

Спасибо, Роберт. Проблема здесь в том, что прокси-сервер фактически не выполняет то, что он должен делать. Вызовы к получателям прокси возвращают значение null. – juanedi