我正在使用自定义查询来访问liferay中的现有实体。由于我没有新的实体,所以我按如下方式创建了一个类:
public class TestServiceBuilderPortlet {
public static List<JournalArticle> getList() {
List<JournalArticle> jaList = null;
// fetch liferay's session factory
SessionFactory sessionFactory = (SessionFactory) PortalBeanLocatorUtil.locate("liferaySessionFactory");
Session session = null;
SQLQuery query = null;
try {
session = sessionFactory.openSession(); // Line A
query = session.createSQLQuery("select {ja.*} from journalarticle as ja");
query.setCacheable(false);
query.addEntity("JournalArticle", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portlet.journal.model.impl.JournalArticleImpl"));
QueryPos qPos = QueryPos.getInstance(query);
jaList = query.list();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (session != null) sessionFactory.closeSession(session);
}
return jaList;
}
}
当我调用上面的函数时,我得到了异常:“没有Hibernate会话绑定到线程,并且配置不允许在这里创建非事务性的”
我根据一些来源获得了上述代码:
http://www.liferay.com/community/forums/-/message_boards/view_message/7158040#_19_message_7166735
How to fetch liferay entity through custom-finder in custom plugin portlet?
我也搜索上述异常并且有一个解决方法:将hibernate.current_session_context_class=thread
添加到portal-ext.properties但它确实对我有效。
我做错了吗?
答案 0 :(得分:0)
您可以在service.xml和XXXLocalServiceImpl.java中创建空白实体,您可以使用您的代码添加方法(从db获取记录),然后您就不会收到有关hibernate会话的错误。基本上这个类是必要的hibernate会话。