我什么时候需要生成休眠运行时代理?

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 以外的其他提供程序时才重要)。