我正在使用 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/