【问题标题】:How does CGLIB proxy String or other final classes? [duplicate]CGLIB 如何代理 String 或其他 final 类? [复制]
【发布时间】:2018-08-22 01:40:24
【问题描述】:

我想问一个关于 Hibernate 中的 Lazy Fetching 的问题。

据我所知,为了实现 Lazy Fetching,Hibernate 创建了一个占位符,它是真实属性的代理。

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

【问题讨论】:

    标签: java hibernate jpa cglib


    【解决方案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. Hibernate 首先代理您的实体类,将相应的attribute Interceptors 注入到相应的 getter 中,因此实际的调用堆栈通常如下所示:
    myEntity.getMyString()
       |_ proxy.getMyString()
         |_ lazyAttributeLoadingInterceptor.fetchAttribute(myEntity,"myString")
           |_ ... (actual call to underlying DB if required)
    

    也就是说,你在这里所说的一切都是正确的:

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

    如果你用 entity/pojo 代替 property 来结束这句话

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 2023-03-26
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多