我得到以下异常:
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)
当我尝试从以下几行拨打电话时:
Model subProcessModel = getModelByModelGroup(1112); System.out.println(subProcessModel.getElement().getNote());
我getModelByModelGroup(int modelgroupid)首先实现了这样的方法:
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; } }
并得到了例外。然后一位朋友建议我始终测试该会话并获取当前会话,以避免出现此错误。所以我这样做:
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,但是不允许这样做,因此建议我控制会话
这是错误的,因为你在提交事务时将会话管理配置设置为关闭会话。检查是否有以下内容:
<property name="current_session_context_class">thread</property>
在你的配置中。
为了克服此问题,你可以更改会话工厂的配置或打开另一个会话,而仅要求提供那些延迟加载的对象。但是我在这里建议的是在getModelByModelGroup本身中初始化此惰性集合并调用:
Hibernate.initialize(subProcessModel.getElement());
当你仍处于活动状态时。
最后一件事。一个友好的建议。你的方法中有以下内容:
for (Model m : modelList) { if (m.getModelType().getId() == 3) { model = m; break; } }
请安装此代码,只需在上面几行的查询语句中过滤ID等于3的那些模型。
如果使用Spring将类标记为@Transactional,则Spring将处理会话管理。
@Transactional public class MyClass { ... }
通过使用@Transactional,可以自动处理许多重要方面,例如事务传播。在这种情况下,如果调用另一个事务方法,则该方法可以选择加入正在进行的事务,从而避免“无会话”异常。
@Transactional