CGLIB如何代理String或其他最终类?

时间:2018-08-21 17:02:29

标签: java hibernate jpa cglib

我想问一个有关Hibernate中的惰性抓取的问题。

据我所知,为了实现延迟获取,Hibernate创建了一个占位符,该占位符是不动产的代理。

如果我的实体包含String属性或其他最终类怎么办? CGLIB将如何对其进行子类化?

1 个答案:

答案 0 :(得分:1)

简而言之:

  1. CGLib完全不能代理最终类,您以前可能已经在日志中看到类似Could not generate CGLIB subclass of class [class SomeClass]: Common causes of this problem include using a final class or a non-visible class
  2. 的内容。
  3. Hibernate首先代理您的实体类,并将相应的attribute Interceptors注入到各自的getter中,因此实际的调用堆栈通常如下所示:
myEntity.getMyString()
   |_ proxy.getMyString()
     |_ lazyAttributeLoadingInterceptor.fetchAttribute(myEntity,"myString")
       |_ ... (actual call to underlying DB if required)

也就是说,您在此处声明的所有内容都是正确的:

  

Hibernate创建一个占位符,该占位符是真实...的代理。

如果您以实体 / pojo 代替财产

这个词结尾