什么时候实体 - 类增强了,为什么?jpa,spring,hibernate,javassist

dpo*_*ski 5 spring hibernate jpa lazy-loading javassist

我使用的是spring 3.0.6,jpa 2.0,hibernate 3.6.8.我的问题是,在哪种情况下javassist用于为EntityClass创建"代理"?这个代理的原因是什么?我有以下实体:

@Entity
public MyEntity{
..

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

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

..
}
Run Code Online (Sandbox Code Playgroud)

当我从db加载MyEntity时,实体类就像MyEntity __ $$ _ javassist.为什么这样做?做什么的?我认为这里只能使用常规类MyEntity.

要实现延迟加载,我们可以:

  • 对于@OneToMany - 可以在这里使用PersistenceBag
  • 对于@ManyToOne - 这里应该像Adress_ $$ _javassist 一样使用"enchancedClass"

那么什么是让MyEntity迷恋的理由呢?在哪里我可以阅读更多关于它的内容?你能推荐哪本书/文章/博客?

Pio*_*ski 5

增强实体类的主要原因是 JPA(或 Hibernate)需要跟踪实体对象状态。

特别是,JPA 必须知道给定的实体字段是否是“脏”的 - 它已被用户修改,但此更改尚未反映在数据库中,因此 JPA 必须在提交事务时将其与数据库同步。

另一种情况是实体字段的“已加载”状态。任何字段都可以指定为延迟加载。当要使用此类字段时,JPA 必须知道必须执行数据库查询来初始化该字段的值。

Hibernate 的默认设置是使用运行时增强 - 代理只是添加了额外内容的实体的子类。

这里概述了一些一般性的想法。