java - 如何修复 org.hibernate.LazyInitializationException - 无法初始化代理 - 没有 session

标签 java hibernate session orm lazy-loading

我得到以下异常:

Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
    at sei.persistence.wf.entities.Element_$$_jvstc68_47.getNote(Element_$$_jvstc68_47.java)
    at JSON_to_XML.createBpmnRepresantation(JSON_to_XML.java:139)
    at JSON_to_XML.main(JSON_to_XML.java:84)

当我尝试从 main 调用以下行时:

Model subProcessModel = getModelByModelGroup(1112);
System.out.println(subProcessModel.getElement().getNote());

我首先像这样实现了 getModelByModelGroup(int modelgroupid) 方法:

public static Model getModelByModelGroup(int modelGroupId, boolean openTransaction) {

    Session session = SessionFactoryHelper.getSessionFactory().getCurrentSession();     
    Transaction tx = null;

    if (openTransaction) {
        tx = session.getTransaction();
    }

    String responseMessage = "";

    try {
        if (openTransaction) {
            tx.begin();
        }
        Query query = session.createQuery("from Model where modelGroup.id = :modelGroupId");
        query.setParameter("modelGroupId", modelGroupId);

        List<Model> modelList = (List<Model>)query.list(); 
        Model model = null;

        for (Model m : modelList) {
            if (m.getModelType().getId() == 3) {
                model = m;
                break;
            }
        }

        if (model == null) {
            Object[] arrModels = modelList.toArray();
            if (arrModels.length == 0) {
                throw new Exception("Non esiste ");
            }

            model = (Model)arrModels[0];
        }

        if (openTransaction) {
            tx.commit();
        }

        return model;

   } catch(Exception ex) {
       if (openTransaction) {
           tx.rollback();
       }
       ex.printStackTrace();
       if (responseMessage.compareTo("") == 0) {
           responseMessage = "Error" + ex.getMessage();
       }
       return null;
    }
}

并得到了异常。然后一位 friend 建议我总是测试 session 并获取当前 session 以避免此错误。所以我这样做了:

public static Model getModelByModelGroup(int modelGroupId) {
    Session session = null;
    boolean openSession = session == null;
    Transaction tx = null;
    if (openSession) {
        session = SessionFactoryHelper.getSessionFactory().getCurrentSession(); 
        tx = session.getTransaction();
    }
    String responseMessage = "";

    try {
        if (openSession) {
            tx.begin();
        }
        Query query = session.createQuery("from Model where modelGroup.id = :modelGroupId");
        query.setParameter("modelGroupId", modelGroupId);

        List<Model> modelList = (List<Model>)query.list(); 
        Model model = null;

        for (Model m : modelList) {
            if (m.getModelType().getId() == 3) {
                model = m;
                break;
            }
        }

        if (model == null) {
            Object[] arrModels = modelList.toArray();
            if (arrModels.length == 0) {
                throw new RuntimeException("Non esiste");
            }

            model = (Model)arrModels[0];

            if (openSession) {
                tx.commit();
            }
            return model;
        } catch(RuntimeException ex) {
            if (openSession) {
                tx.rollback();
            }
            ex.printStackTrace();
            if (responseMessage.compareTo("") == 0) {
                responseMessage = "Error" + ex.getMessage();
            }
            return null;        
        }
    }
}

但仍然出现同样的错误。 我已经为这个错误阅读了很多内容,并找到了一些可能的解决方案。其中之一是将lazyLoad设置为false,但我不允许这样做,这就是为什么我被建议控制 session

最佳答案

如果您使用 Spring 将类标记为 @Transactional ,然后 Spring 将处理 session 管理。

@Transactional
public class MyClass {
    ...
}

通过使用@Transactional,可以自动处理事务传播等许多重要方面。在这种情况下,如果调用另一个事务方法,该方法将可以选择加入正在进行的事务,从而避免“无 session ”异常。

警告如果您使用 @Transactional,请注意由此产生的行为。见 this article对于常见的陷阱。例如,即使您没有显式调用 save

,对实体的更新也会保持

关于java - 如何修复 org.hibernate.LazyInitializationException - 无法初始化代理 - 没有 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21574236/

相关文章:

java - 是否可以在运行时指定上下文属性占位符

java - Logback - 打印出调用日志方法的方法名

java - 是否存在 Objective-Java 集成库?

java - 名为 xyz 的实体管理器没有持久性提供程序

java - 使用 Java 生成证书、公钥和私钥

java - 如何使用 Hibernate Validator 来验证表中多行的日期范围?

java - 如何从 Hibernate POJO 类创建表?如何在 Hibernate 中实现逆向工程策略?

javascript - ReactJS - 用什么代替 JWT 来保持 session

asp.net - 负载均衡器如何与 ASP.NET session 配合使用

php - 我可以在 $_SESSION 变量中保存什么级别的 secret 信息?