在liferay 6.1中访问现有表时出现Hibernate异常?

时间:2013-11-23 03:55:06

标签: liferay-6

我正在使用自定义查询来访问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但它确实对我有效。

我做错了吗?

1 个答案:

答案 0 :(得分:0)

您可以在service.xml和XXXLocalServiceImpl.java中创建空白实体,您可以使用您的代码添加方法(从db获取记录),然后您就不会收到有关hibernate会话的错误。基本上这个类是必要的hibernate会话。