#hibernate #liferay #hibernate-mapping
#переход в спящий режим #liferay #спящий режим-отображение
Вопрос:
Я использую Liferay 6.2 GA5 Community Edition.
Я обычно создавал объекты в my service.xml
, запускал Service Builder и успешно генерировал все файлы классов. Я пробовал любую операцию CRUD в модели MyModel и всегда получал результат успеха.
У меня есть хранимая процедура, выводящая список записей, запись представляет 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)
, потому что я пытался преобразовать модель гибернации по умолчанию в MyModel.
После поиска такого рода исключений я получил статью в разделах, посвященных спящему режиму, в которой говорится, что я должен поместить @Entity
аннотацию в MyModel. Но в Liferay модель всегда будет создаваться из service.xml
, верно?
Как решить эту проблему? Есть ли какой-либо атрибут service.xml
или какая-либо конфигурация XML-файла, которая может решить эту проблему?
большое вам спасибо
Ответ №1:
Вы смешиваете объекты, созданные ServiceBuilder, с необработанным доступом в режиме гибернации? Я бы предпочел предложить вам либо остаться на стороне ServiceBuilder (которая в основном скрывает от вас режим гибернации), либо полностью перейти в режим гибернации и опустить ServiceBuilder.
В контексте Liferay (например, необходимость охватывать приложения, развернутые в нескольких контекстах) ServiceBuilder имеет свои преимущества: вы можете легко получить доступ к своему API во всех плагинах / портлетах, независимо от того, в каком веб-приложении они развернуты.
Комментарии:
1. спасибо, я удалил
.addEntity()
метод и выполнил правильное приведение к результатуquery.list()
, теперь это работает