java - Hibernate 和 javaassist 代理/延迟初始化导致反射错误

标签 java hibernate reflection proxy javassist

我正在使用 Hibernate 4 并尝试使用反射来访问刚从数据库加载的实体中的字段。但是,即使实体的字段实际上有值,通过反射检索字段值也会返回 null 值。

经过一些调试后,我看到检索到的实体是该实体的 javassist 代理。我假设问题是由于延迟加载实体造成的,但我不确定如何解决该问题。

@Entity
public class User
{

  @Id
  @GeneratedValue(strategy=GenerationType.TABLE, generator="UUIDGenerator")
  @Column(name="id")
  private Long id;

  @NotNull
  private String username;
  private String password;

  @Version
  @Column(name="version")
  private Integer version;
}


public User updateUser(long userId, User user) {
    // first need to find the user in the db
    User u = checkNotNull( userRepository.findOne(userId) );

    // get the version field
    Field field = User.class.getDeclaredField("version");

    // check that the versions of the two objects match
    ReflectionUtils.makeAccessible(field);
    Object targetVersion = checkNotNull( ReflectionUtils.getField(field, u) );

    return u;
}

在调试器中,我看到 u 实际上是 class com.ia.domain.User_$$_jvst8cf_3 而不是 com.ia.domain .用户。如果我向下钻取 var 并检查 version 字段,它会列为 null。然而 u.getVersion() 将检索一个正确的值。

有没有办法通过反射获取值?我是否必须以不同方式处理它作为代理对象的情况?如果可能的话,我宁愿不需要知道代理对象的存在,而只是将检索到的对象视为它应该是的 User 对象。

最佳答案

您可以通过这样做从代理中获取底层类:

if (user instanceof HibernateProxy) {
    user = (User) ((HibernateProxy) user).getHibernateLazyInitializer().getImplementation();
}

请注意,如果该对象尚未被 hibernate 初始化(例如,一个延迟加载的关联),您需要先对其进行初始化:

Hibernate.initialize(entity);

关于java - Hibernate 和 javaassist 代理/延迟初始化导致反射错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23147241/

相关文章:

java - 具有相等元素的 JAX-B 枚举生成

postgresql - 带有条件生成器的 Spring JPA 将带有时区的时间戳转换为带有给定时区的本地时间

java - 类型不匹配 : cannot convert from Class<capture#1-of ? > 到 Class<?>[]

reflection - 如何使用 Swift 2.0 和反射获取属性名称及其值?

java - 使用JDI时如何访问(每行代码的)语句对象?

java - 为什么我随机选择的数字的输出包含重复项?

java - 这个简单的 HQL 语法有什么问题?

java - hibernate 错误 : ids for this class must be manually assigned before calling save():

c# - .NET中是否有与Java的ClassFileTransformer等效的文件? (一种替换类的方法)

java - 要开发 Internet Messenger,我应该怎么做?