我什么时候需要生成休眠运行时代理?
When do I need hibernate runtime proxy generation?
休眠文档说:"the constructor should be defined with at least package visibility if you wish to leverage runtime proxy generation"。
我读过 hibernate 文档,hibernate 可以增强字节码而不是代理创建(Hibernate 5.x)。它可以在所有情况下用这种新方法代替代理创建吗?
在哪些情况下我需要运行时代理生成?
运行时增强是默认的,用于延迟加载支持。如果你想在 @OneToOne
或 @ManyToOne
关联上使用延迟加载,那么将被延迟加载的 class 应该有一个受保护的构造函数,否则 Hibernate 会在你尝试获取时抛出异常父实体。例如:
@Entity
public class Parent {
@OneToOne(fetch=FetchType.LAZY)
private Child child;
}
在此示例中,Child
class 必须具有受保护或更高可见性的构造函数。
使用 Hibernate 5.0,您可以进行字节码增强。这是一个额外的编译步骤,因此您需要将它放在您的 Maven 或 Ant(或其他)构建过程中。通过字节码增强,您不需要无参数构造函数,但如果您不包含它,您的应用程序将不会遵守 JPA 规范(仅当您计划切换到 Hibernate 以外的其他提供程序时才重要)。
休眠文档说:"the constructor should be defined with at least package visibility if you wish to leverage runtime proxy generation"。 我读过 hibernate 文档,hibernate 可以增强字节码而不是代理创建(Hibernate 5.x)。它可以在所有情况下用这种新方法代替代理创建吗? 在哪些情况下我需要运行时代理生成?
运行时增强是默认的,用于延迟加载支持。如果你想在 @OneToOne
或 @ManyToOne
关联上使用延迟加载,那么将被延迟加载的 class 应该有一个受保护的构造函数,否则 Hibernate 会在你尝试获取时抛出异常父实体。例如:
@Entity
public class Parent {
@OneToOne(fetch=FetchType.LAZY)
private Child child;
}
在此示例中,Child
class 必须具有受保护或更高可见性的构造函数。
使用 Hibernate 5.0,您可以进行字节码增强。这是一个额外的编译步骤,因此您需要将它放在您的 Maven 或 Ant(或其他)构建过程中。通过字节码增强,您不需要无参数构造函数,但如果您不包含它,您的应用程序将不会遵守 JPA 规范(仅当您计划切换到 Hibernate 以外的其他提供程序时才重要)。