你的疑问是:为什么 Hibernate 实体类不能定义为 final
?如果定义为 final
,会有什么影响?如何解决这个问题?
我来详细解释一下。
1. Hibernate 为什么要用代理?
Hibernate 在加载对象时,有两种加载策略:
- 立即加载(Eager Loading):一次性加载所有关联的对象。
- 延迟加载(Lazy Loading):先不加载关联的对象,等用到时再去数据库查询。
为了实现 延迟加载(Lazy Loading),Hibernate 使用 代理模式(Proxy Pattern),即在运行时动态生成一个继承自你的实体类的子类,拦截方法调用并在需要时从数据库加载数据。例如:
User user = session.get(User.class, 1);
如果 User
关联了 Order
对象,Hibernate 可能不会立即加载 Order
,而是返回 User
的一个代理对象。当你调用 user.getOrders()
时,代理对象才会触发数据库查询。
2. 为什么 final
关键字会影响 Hibernate?
如果你把实体类声明为 final
,Java 语法就不允许它被继承,而 Hibernate 正是通过创建一个继承你的实体类的子类来实现延迟加载的。
这样,Hibernate 就无法在运行时生成代理子类,导致 延迟加载(Lazy Loading)失效