JPA 持久性和 Hibernate javassist 对象

Posted

技术标签:

【中文标题】JPA 持久性和 Hibernate javassist 对象【英文标题】:JPA persistence and Hibernate javassist objects 【发布时间】:2015-10-16 09:10:45 【问题描述】:

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

我有一个从 mysql 表中选择行的查询,结果中有代理对象。请看下图。

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

我的查询示例:

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;

【问题讨论】:

不管有没有上下文,这是一个很好的问题,但是你介意解释一下你为什么问这个吗?是为了防止以后出现惰性初始化错误吗? 当我的代码尝试序列化类时,我收到类似“尝试序列化 java.lang.Class: org.hibernate.proxy.HibernateProxy。忘记注册类型适配器?”之类的错误。我们在整个项目中都进行了查询和序列化,并且工作正常。我似乎只是发生了这个用户查询结果,这很奇怪。 这听起来更像是实体中有些东西老实说是不可序列化的。您是否有任何属性被设为瞬态(如:未持久化)? 我刚刚更新了问题描述。我通过迭代用户对象来临时解决我们的问题。我们不想这样做,因为也许我们在其他查询中遇到了同样的问题。 【参考方案1】:

您可以在 JPQL/HQL 查询中使用 JOIN FETCH 关键字。在您的示例中,如果您不想处理代理对象而不是真实 Account 对象,请添加“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();

【讨论】:

问题是用户对象作为代理对象返回,这很奇怪。 是否有可能之前在会话中加载了 ID 为 102 和 106 的用户并被代理? 我刚刚更新了问题描述。我通过迭代用户对象来临时解决我们的问题。我们不想这样做,因为也许我们在其他查询中遇到了同样的问题。 在forum.hibernate.org/viewtopic.php?f=9&t=982170&start=0字段上使用注释时,有时hibernate会返回代理加载的实体

以上是关于JPA 持久性和 Hibernate javassist 对象的主要内容,如果未能解决你的问题,请参考以下文章

Spring整合Hibernate实现JPA持久化

JPASpringData JPA Hibernate和Mybatis 的区别和联系

使用 Hibernate 和 JPA 持久化 JSON 对象

在 JPA/Hibernate 中持久化映射到 MySQL 视图的实体

Spring + Hibernate + JPA [关闭]

JPA:传递给持久化的分离实体:嵌套异常是 org.hibernate.PersistentObjectException