2012-05-16 31 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的一些一般想法。