2012-05-16 4 views
5

Я использую Spring 3.0.6, jpa 2.0, спящий режим 3.6.8. Мой вопрос: в каких ситуациях javassist используется для создания «прокси» для EntityClass? И в чем причина этого прокси? У меня есть следующие лица:Когда объекты-классы расширены и зачем? jpa, spring, hibernate, javassist

@Entity 
public MyEntity{ 
.. 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "adresseID") 
    private Adresse adresse; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "myEntity") 
    private List<Parameter> parameters; 

.. 
} 

Когда я загружаю MyEntity из БД, класс сущности является чем-то вроде MyEntity __ $$ _ Javassist. Почему это делается? Зачем? Я думаю, что здесь можно использовать только обычный класс MyEntity.

Для реализации отложенной загрузки, мы можем:

  • для @OneToMany - PersistenceBag здесь можно использовать
  • для @ManyToOne - здесь должны быть использованы "enchancedClass" как Adress_ $$ _javassist

Итак, в чем причина для зачатия MyEntity? Где я могу прочитать что-то еще об этом? Какую книгу/статью/блог вы можете мне порекомендовать?

ответ

4

Основная причина, по которой классы сущностей расширены, заключается в том, что JPA (или Hibernate) необходимо отслеживать состояние объектов объектов.

В частности, JPA должно знать, что данное поле объекта «грязно» - оно было изменено пользователем, но это изменение еще не отражено в базе данных, поэтому JPA должна синхронизировать его с базой данных при совершении транзакции.

Другой случай - это «загруженное» состояние поля объекта. Любое поле может быть назначено для ленивой загрузки. Когда такое поле будет использоваться, JPA должно знать, что запрос базы данных должен быть выполнен для инициализации значения этого поля.

По умолчанию Hibernate используется для использования времени выполнения - прокси-сервер является просто подклассом объекта с добавленным дополнением.

Некоторые общие идеи изложены here.