5

我正在使用 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;

..
}

当我从 db 加载 MyEntity 时,实体类类似于 MyEntity__$$_javassist。为什么要完成?做什么的?我认为这里可以使用常规类 MyEntity 。

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

  • 对于@OneToMany - PersistenceBag 可以在这里使用
  • 对于@ManyToOne - 这里应该使用“enchancedClass”,如 Adress_ $$ _javassist

那么增强 MyEntity 的原因是什么?我可以在哪里阅读更多有关它的信息?你能推荐我哪本书/文章/博客?

4

1 回答 1

5

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

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

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

Hibernate 的默认设置是使用运行时增强——代理只是实体的一个子类,添加了额外的东西。

此处概述了一些一般性的想法。

于 2012-05-20T19:50:51.297 回答