Ошибка Liferay org.hibernate.Исключение MappingException: неизвестный объект: com.mycompany.myapp.model.Моя модель

#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() , теперь это работает