如何修复org.hibernate.LazyInitializationException

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

我得到以下异常:

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];
        }


但仍然得到同样的错误。我一直在阅读这个错误,并找到了一些可能的解决方案。其中一个是将lazyLoad设置为false但我不允许这样做,这就是我被建议控制会话的原因


慕村225694
浏览 1517回答 3
3回答

天涯尽头无女友

如果你使用Spring将类标记为@Transactional,那么Spring将处理会话管理。@Transactionalpublic&nbsp;class&nbsp;MyClass&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;...}通过使用@Transactional,可以自动处理许多重要方面,例如事务传播。在这种情况下,如果调用另一个事务方法,则该方法可以选择加入正在进行的事务,避免“无会话”异常。

眼眸繁星

你可以尝试设置<property&nbsp;name="hibernate.enable_lazy_load_no_trans">true</property>在hibernate.cfg.xml或persistence.xml中这个属性要记住的问题在这里得到了很好的解释
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java