Hibernate中定义的Entity类(无论是JPA实现,还是Hibernate Native实现),都建议Entity类是final的,但这不是必须的。
事实上,如果不考虑利用Entity类的延迟加载特性,那么Entity类无需是final的。
Hibernate中Entity类的延迟加载是通过运行时动态代理实现的。而Java动态代理实现中,要求被代理类(就是这里的Entity类)不能是final的,其中的实例变量也不能是final的。这是因为Java动态代理是通过创建Entity类的子类对象并强制转换为Entity类对象,实现被代理对象的。而final的Entity类是无法被继承的,因而也就没有子类了。
Hibernate的动态代理实现还要求Entity类必须实现接口,Entity类为实例变量定义getter/setter方法。
不过,从Hibernate 5开始,Hibernate利用CGLIB和ASM支持了更底层的对Java字节码的增强技术,这使得Entity类的延迟加载有了新的实现方式。