我正在使用Liferay 6.2 GA5社区版。
我通常在service.xml
创建实体,运行服务构建器,并成功生成所有类文件。我在MyModel模型中尝试了任何CRUD操作,并始终获得成功结果。
我有一个存储过程,其输出记录列表,一条记录代表MyModel。 然后我尝试像这样调用存储过程:
SessionFactory sessionFactory = (SessionFactory) PortalBeanLocatorUtil.locate("liferaySessionFactory");
Session session = null;
try {
session = sessionFactory.openSession();
SQLQuery query = session.createSQLQuery("{ CALL dbo.USP_GET_CHILD(:abc) }");
query.addEntity("MyModel", MyModel.class).setString("abc", "aaa");
List<MyModel> list = (List<MyModel>) query.list();
_log.info("size: " + list.size());
for (MyModel o : list) {
_log.info("result: " + o.getFullName());
}
} catch (Exception e) {
_log.error(e.getMessage(), e);
}
从上面的代码中,我在第org.hibernate.MappingException: Unknown entity: com.mandiri.ipsplus.model.MyModel
行
query.list()
我知道这件事发生了,因为我放了.addEntity("MyModel", MyModel.class)
,
但如果我没有这样做,我将始终ClassCastCastException
在for (MyModel o : list)
行,因为我试图将Hibernate默认模型转换为MyModel。
在搜索了这种异常之后,我在Hibernate特定的主题中得到了一些文章,说我必须在MyModel中添加@Entity
注释。但是在Liferay中,模型将始终从service.xml
生成,对吧?
如何解决这个问题? service.xml
中是否有任何属性或任何可以解决此问题的XML文件配置?
非常感谢
答案 0 :(得分:1)
您是否将ServiceBuilder生成的实体与原始hibernate访问混合在一起?我建议您留在ServiceBuilder端(主要是隐藏hibernate)或者一直休眠并省略ServiceBuilder。
在Liferay的上下文中(例如,需要涵盖在多个上下文中部署的应用程序)ServiceBuilder有其优点:无论在哪个Web应用程序中部署,都可以轻松访问所有插件/ portlet中的API。