JPA持久化和Hibernate javassist对象

3

我正在使用Play Framework v.1.2.6开发项目,当我尝试从数据库中检索对象时遇到了对象休眠问题。https://www.playframework.com/documentation/1.2.x/jpa

我的查询从一个mysql表中选择行,在结果中有代理对象。请参见下面的图片。enter image description here

我没有使用任何Hibernate配置文件,只在我的模型类中使用@注释。

我的查询示例:

static List<User> getAllUsersFromAccount(Account account) {
    return  User.find(
            "SELECT u " +
            "FROM User u " +
            "WHERE u.account=?", 
            account).fetch();
}

有人知道如何避免在查询结果中获取代理对象吗?

目前,我们遍历用户数组并检查实体是否为HibernateProxy的实例。我们不想这样做,因为可能对其他查询也存在同样的问题。

private static <T> T initializeAndUnproxy(T entity) {
    Hibernate.initialize(entity);
    if(entity instanceof HibernateProxy) {
        entity = (T)((HibernateProxy)entity).getHibernateLazyInitializer().getImplementation();
    }
    return entity;
}

这是一个好问题,无论是否有上下文,但您介意解释一下为什么要问吗?是为了防止后面出现懒惰初始化错误吗? - Gimby
当我的代码尝试序列化类时,我会遇到错误,例如“尝试序列化java.lang.Class:org.hibernate.proxy.HibernateProxy。忘记注册类型适配器了吗?” 我们在整个项目中都有查询和序列化,并且运行良好。但似乎只发生在这个用户查询结果上,这非常奇怪。 - user3778610
说实话,这更像是实体中有一些无法序列化的东西。您是否有任何被标记为瞬态(即:不持久化)的属性? - Gimby
我刚刚更新了问题描述。我通过迭代用户对象提供了一个临时解决方案来解决我们的问题。我们不希望这样做,因为可能在其他查询中也存在相同的问题。 - user3778610
1个回答

0

你可以在JPQL/HQL查询中使用JOIN FETCH关键字。在你的例子中,如果你不想处理代理对象而是真正的账户对象,可以添加'JOIN FETCH u.account'

static List<User> getAllUsersFromAccount(Account account) {
    return  User.find(
            "SELECT u " +
            "FROM User u " +
            "JOIN FETCH u.account " +
            "WHERE u.account=?", 
            account).fetch();
}

问题在于返回的用户对象是代理对象,这很奇怪。 - user3778610
1
用户ID为102和106的用户之前是否已经在会话中被加载并代理化了? - antonu17
我刚刚更新了问题描述。我通过迭代用户对象来提供一个临时解决方案来解决我们的问题。我们不想这样做,因为也许我们在其他查询中也有同样的问题。 - user3778610
有时候在字段上使用注解时,Hibernate 会返回代理加载的实体。https://forum.hibernate.org/viewtopic.php?f=9&t=982170&start=0 - antonu17

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接