2012-05-16 32 views
5

我使用spring 3.0.6,jpa 2.0,hibernate 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; 

.. 
} 

當我從加載dB的myEntity所,類實體的是一樣的東西myEntity所__ _ $$了Javassist。爲什麼這樣做?做什麼的?我認爲在這裏可以使用普通的MyEntity類。

要實現延遲加載,我們可以:

  • 爲@OneToMany - PersistenceBag這裏可以使用
  • 的@ManyToOne - 這裏應該使用 「enchancedClass」 像Adress_ $$ _javassist

那麼強化MyEntity的原因是什麼?我可以在哪裏閱讀更多關於它的內容?你可以推薦我哪本書/文章/博客?

回答

4

實體類增強的主要原因是JPA(或Hibernate)需要跟蹤實體對象的狀態。

特別是,JPA必須知道給定的實體字段是否是「髒的」 - 它是由用戶修改的,但這種更改尚未反映到數據庫中,因此JPA必須在提交事務時將其與數據庫同步。

另一種情況是實體字段的「加載」狀態。任何字段都可以分配爲延遲加載。當即將使用這樣的字段時,JPA必須意識到必須執行數據庫查詢來初始化該字段的值。

Hibernate的默認設置是使用運行時擴展 - 代理只是添加了額外東西的實體的子類。

概述here的一些一般想法。