根据hibernate docs,我的@ManyToOne
关系默认情况下应该有代理对象。但是,当我在Eclipse调试器(“变量”视图)中查看扩展对象时,看起来字段变量是实体类中定义的基类型的实例。此外,当我使用session.get(type, id)
致电hibernate.show_sql=true
时,我可以看到left outer join
对于在对象上定义的所有@ManyToOne
关系。
为了让Hibernate为这些关系创建代理类/对象,是否需要特定的东西?也许是字节码增强?
来自hibernate docs的引用:
Lazy抓取集合是使用Hibernate自己实现的 持久集合的实现。但是,有所不同 单端关联中的惰性行为需要机制。 必须代理关联的目标实体。过冬 使用实现持久对象的延迟初始化代理 通过字节码访问的运行时字节码增强 提供商。
在启动时,Hibernate默认为所有持久性生成代理 类和使用它们来启用多对一的延迟提取和 一对一协会。
答案 0 :(得分:2)
所有@ManyToOne
和@OneToOne
关联都是EAGER by default,这就是他们在获取根实体时加入的原因。
仅在未初始化关联时才使用代理。要使你的关联成为LAZY,你只需要添加LAZY fetch属性:
@ManyToOne(fetch = FetchType.LAZY)