【问题标题】:When are Entities-Classes enhanced and what for? jpa, spring, hibernate, javassistEntity-Classes 什么时候增强,有什么用? jpa, 春天, 休眠, javassist
【发布时间】:2012-05-16 19:46:34
【问题描述】:

我正在使用 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 的原因是什么?我可以在哪里阅读更多有关它的信息?你能推荐我哪本书/文章/博客?

【问题讨论】:

    标签: spring hibernate jpa lazy-loading javassist


    【解决方案1】:

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

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

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

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

    概述了一些一般性的想法here

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 2011-09-23
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 2010-10-06
      相关资源
      最近更新 更多