Что делает Hybris, когда мы делаем Modelservice.Save ()? - PullRequest
0 голосов
/ 24 мая 2018

Пока я сохраняю модель, используя ModelService.save(), она выбрасывает

de.hybris.platform.servicelayer.interceptor.InterceptorException: [de.hybris.platform.servicelayer.interceptor.impl.UniqueAttributesInterceptor@555528e4]:ambiguous unique keys
        at de.hybris.platform.servicelayer.interceptor.impl.UniqueAttributesInterceptor.onValidate(UniqueAttributesInterceptor.java:158)

Я понимаю, что это происходит, потому что она пытается INSERT и может ли она сделать INSERT_UPDATE тогда проблема может быть решена.Я не хочу, чтобы Legacy Mode был включен, поэтому, пожалуйста, предоставьте мне решение, в котором я могу использовать метод от INSERT_UPDATE до ModelService.save().

Если ModelService.save () выполняет INSERT_UPDATE, то почему возникает ошибка.

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

ModelService в hybris реализует функции, отличные от ожидаемых.Сервис моделей поддерживает:

Создание нового элемента

ProductModel newProduct = modelService.create(ProductModel.class);

Запись изменений в элемент

modelService.save(product);

Удаление элемента

modelSerivce.remove(product);

Обновление элемента при внесении изменений в другом контексте

modelService.refresh(product);

Извлечение данных из базы данных

Если вы хотите изменить существующий элемент, вам нужно сначала получить его из базы данных.Есть несколько возможностей для поиска существующих предметов.Рассмотрим следующие случаи:

Извлечение существующего продукта, пользователя, категории ... Для большинства стандартных элементов hybris есть службы для извлечения. Используйте ProductService, UserService, CategoryService ... Nowиспользуйте ModelService для сохранения изменений, внесенных в эту модель.

ProductModel product = productService.getProductForCode("myEAN");
product.setMyCustomAttribute("ABC");
modelService.save(product);

Редактирование нестандартного элемента / типа элемента без службы, подготовленной Hybris Когда hybris не предоставляет службы для получения элемента из базы данныхВам необходимо внедрить этот сервис самостоятельно.Есть несколько возможностей сделать это.

FlexibleSearchService

Map<String, Object> params = new HashMap<>();
params.put("id", "123");
String query = "SELECT {pk} FROM {MyCustomType} WHERE {id} LIKE ?id";
SearchResult<MyCustomTypeModel> result = flexibleSearchService.search(query, params);
List<MyCustomTypeModel> myCustomTypesWithId = result.getResult();

GenericSearchService

GenericSearchField idField = new GenericSearchField(MyCustomTypeModel._TYPECODE, MyCustomTypeModel.ID);
GenericCondition condition = GenericCondition.createConditionForValueComparison(idField, Operator.EQUAL, "123");
GenericQuery query = new GenericQuery(MyCustomTypeModel._TYPECODE, condition);
SearchResult<MyCustomTypeModel> searchResult = genericSearchService.search(query);
List<MyCustomTypeModel> myCustomTypesWithId = searchResult.getResult();

Это только самые выдающиеся из них.Обратитесь к справочным / вики-страницам hybris за дополнительной информацией.Какой из них вы предпочитаете, зависит от вас.Оба имеют свои преимущества и недостатки.

Рекомендуется обернуть эту функцию доступа к данным в собственные классы.Классы, которые ищут элементы в базе данных, называются DAO (объект доступа к данным).

0 голосов
/ 24 мая 2018

Похоже, вы пытаетесь снова вставить УНИКАЛЬНУЮ запись.

Чтобы обновить запись

  • Вы должны сначала выбрать существующую модель obj (которая содержит pk) издб.Для этого вы можете использовать гибкий поиск, получить модель по примеру и т. Д.
  • Теперь обновите атрибут, который вы хотите
  • Сохранить modelService.save(obj)

Вставить новую запись

  • создать экземпляр модели и установить значения

    final MyModel obj = modelService.create(MyModel.class);

    obj.setId("unique");

  • Сохранить modelService.save(product);

0 голосов
/ 24 мая 2018

В hybris, если вы задали UNIQUE при определении атрибута в Item.xml, тогда это значение должно быть УНИКАЛЬНО, в противном случае выдается ошибка при импорте

Предположим, что ID пользователя для атрибута определил UNIQUE = true для элемента, т.е.

<attribute qualifier="userid" type="java.lang.String">
                        <description>user id of user.</description>
                        <modifiers unique="true"/>
                        <persistence type="property"/>
</attribute>

Теперь вы импортируете данные через ImpEx

INSERT_UPDATE EveryreplyUserAddress;userid[unique=true];street;state
;0001;delhi;delhi

Если вы попытаетесь снова выполнить INSERT_UPDATE с тем же идентификатором пользователя, что и 0001, то будет выдано сообщение об ошибке, поскольку в элементе, который вы определили, идентификатор пользователя является УНИКАЛЬНЫМ ВАЖНО: Во время импорта УНИКАЛЬНОСТЬэто проверка с помощью UniqueAttributesInterceptor.Но вы все равно можете импортировать свои данные, установив прежний режим в положение ON

Так что после включения устаревшего режима ON вызов Interceptor будет пропускать SKIPP, а затем значение будет вставлено в базу данных

* - Элементы.xml

<attribute qualifier="userid" type="java.lang.String">
                        <description>user id of user.</description>
                        <modifiers unique="true"/>
                        <persistence type="property"/>
</attribute>

Используя ModelService, если вы сохраните элемент, снова перехватчик будет проверять UNIQUNESS

...