java - CGLIB如何代理String或其他final类?

标签 java hibernate jpa cglib

我想问一个有关 Hibernate 中延迟获取的问题。

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

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

最佳答案

长话短说:

  1. CGLib 根本无法代理最终类,您之前可能在日志中看到过类似的内容无法生成类 [class SomeClass] 的 CGLIB 子类:此问题的常见原因包括使用最终类或非最终类可见类
  2. Hibernate 首先代理您的实体类,具有相应的 attribute Interceptors注入(inject)到各自的 getter 中,因此实际的调用堆栈通常如下所示:
myEntity.getMyString()
   |_ proxy.getMyString()
     |_ lazyAttributeLoadingInterceptor.fetchAttribute(myEntity,"myString")
       |_ ... (actual call to underlying DB if required)

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

Hibernate creates a placeholder that is a proxy of the real ...

如果您以单词 entity/pojo 而不是 property 结尾

关于java - CGLIB如何代理String或其他final类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51953547/

相关文章:

java - 保存实体时 Spring/Hibernate 编码错误

java - JPA - 一对多合并问题

java - @transactional 方法不会在我们进入方法后立即启动 session

hibernate - 尝试设置 Tomcat 和 JDBC 连接池 : Communications Link Failure

java - 计算属性 wrt JPA。这对我有用吗?

java - 在同一个事务中创建和查找一个 jpa 实体?

java读取并写入\u05DC为 '?'

java - 如何从父类(super class)方法返回子类引用

java - 记录axis2客户端请求和响应

java - DER 编码的 RSA 公钥(八位字节字符串)