为什么我在ManyToOne关联中没有看到hibernate代理对象?

时间:2015-02-04 10:32:39

标签: java hibernate jpa proxy hibernate-mapping

根据hibernate docs,我的@ManyToOne关系默认情况下应该有代理对象。但是,当我在Eclipse调试器(“变量”视图)中查看扩展对象时,看起来字段变量是实体类中定义的基类型的实例。此外,当我使用session.get(type, id)致电hibernate.show_sql=true时,我可以看到left outer join对于在对象上定义的所有@ManyToOne关系。

为了让Hibernate为这些关系创建代理类/对象,是否需要特定的东西?也许是字节码增强?

来自hibernate docs的引用:

  

Lazy抓取集合是使用Hibernate自己实现的   持久集合的实现。但是,有所不同   单端关联中的惰性行为需要机制。   必须代理关联的目标实体。过冬   使用实现持久对象的延迟初始化代理   通过字节码访问的运行时字节码增强   提供商。

     

在启动时,Hibernate默认为所有持久性生成代理   类和使用它们来启用多对一的延迟提取和   一对一协会。

1 个答案:

答案 0 :(得分:2)

所有@ManyToOne@OneToOne关联都是EAGER by default,这就是他们在获取根实体时加入的原因。

仅在未初始化关联时才使用代理。要使你的关联成为LAZY,你只需要添加LAZY fetch属性:

@ManyToOne(fetch = FetchType.LAZY)