2012-05-16 1 views
5

봄 3.0.6, jpa 2.0, 최대 절전 모드 3.6.8을 사용하고 있습니다. 내 질문에, 어떤 상황에서 javassist가 EntityClass에 "프록시"를 만드는 데 사용 되는가? 그리고이 프록시의 이유는 무엇입니까? 나는 다음과 같은 법인이 : 나는 dB에서 MyEntity를로드엔티티 클래스는 언제 향상되며 그 대상은 무엇입니까? 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 __ $$ _와 Javassist 같은입니다. 왜 끝났어? 무엇 때문에? 나는 정규 클래스 인 MyEntity를 여기서 사용할 수 있다고 생각한다.

게으른로드 기능을 구현하기 위해, 우리는 할 수 있습니다

@OneToMany에 대한
  • - PersistenceBag은 @ManyToOne에 대한
  • 여기에 사용할 수 있습니다 - 여기 $$ _javassist
  • Adress_ 처럼 "enchancedClass"를 사용해야합니다

그래서 MyEntity를 강화하는 이유는 무엇입니까? 어디에서 더 읽을 수 있을까요? 어떤 책/기사/블로그를 추천 해 줄 수 있습니까?

답변

4

엔티티 클래스가 향상되는 주된 이유는 JPA (또는 Hibernate)가 엔티티 개체 상태를 추적해야하기 때문입니다.

특정 엔티티 필드가 "dirty"(사용자가 수정했지만이 변경 사항이 아직 데이터베이스에 반영되지 않았기 때문에 JPA는 트랜잭션이 커밋 될 때 데이터베이스와 동기화해야 함)인지 여부를 알아야합니다.

다른 경우는 엔터티 필드의 "로드 된"상태입니다. 모든 필드를 지연로드되도록 지정할 수 있습니다. 그러한 필드가 사용 되려고 할 때 JPA는 해당 필드의 값을 초기화하기 위해 데이터베이스 쿼리를 수행해야한다는 것을 알고 있어야합니다.

Hibernate의 기본값은 런타임 향상을 사용하는 것입니다. 프록시는 여분의 것들이 추가 된 엔티티의 서브 클래스에 불과합니다.

일부 일반적인 아이디어는 here입니다.