I am upgrading an existing hybris 5 application to hybris 6.2.0. During the upgrade I encountered an issue with the UniqueCatalogItemInterceptor. Due to this interceptor i'm unable to save a new item. The application gives me the following exception: de.hybris.platform.servicelayer.interceptor.InterceptorException: [de.hybris.platform.product.impl.UniqueCatalogItemInterceptor@7230d1e8]:unique keys {pk=null} of SizeLineModel () are ambiguous in version Default/Staged
In order to create a better test environment I created a clean hybris 6.2 installation and added my test types. This gives the same exception.
Can anyone help me? Am I doing something wrong?
Items.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
~ [y] hybris Platform
~
~ Copyright (c) 2000-2016 SAP SE
~ All rights reserved.
~
~ This software is the confidential and proprietary information of SAP
~ Hybris ("Confidential Information"). You shall not disclose such
~ Confidential Information and shall use it only in accordance with the
~ terms of the license agreement you entered into with SAP Hybris.
-->
<!--
ATTENTION: This is just an example file. You have to edit it according to your needs.
-->
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="items.xsd">
<relations>
<relation code="EANUnitLines" localized="false" generate="true" autocreate="true">
<sourceElement type="EAN" qualifier="ean" cardinality="one">
<description>The Parent EAN</description>
<modifiers read="true" write="true" search="true" optional="true" />
</sourceElement>
<targetElement type="UnitLine" qualifier="content" cardinality="many" collectiontype="set">
<description></description>
<modifiers read="true" write="true" search="false" partof="true" />
</targetElement>
</relation>
</relations>
<itemtypes>
<itemtype code="UnitLine" jaloclass="org.myproject.jalo.UnitLine" autocreate="true" generate="true">
<deployment typecode="10506" table="test_unit_line" />
<custom-properties>
<!-- marking the type as synchronizing capable here: -->
<property name="catalogItemType">
<value>java.lang.Boolean.TRUE</value>
</property>
<property name="catalogVersionAttributeQualifier">
<value>"catalogVersion"</value>
</property>
<!-- define unique key attributes here; separate multiple attribute qualifiers by commas: -->
<property name="uniqueKeyAttributeQualifier">
<value>"pk"</value>
</property>
</custom-properties>
<attributes>
<attribute qualifier="catalogVersion" type="CatalogVersion">
<modifiers read="true" write="true" search="true" optional="false" />
<persistence type="property" />
</attribute>
<attribute qualifier="amount" type="java.lang.Double">
<modifiers read="true" write="true" search="true" optional="false" />
<persistence type="property" />
</attribute>
<attribute qualifier="unit" type="Unit">
<modifiers read="true" write="true" search="true" optional="true" />
<persistence type="property" />
</attribute>
</attributes>
</itemtype>
<itemtype code="SizeLine" jaloclass="org.myproject.jalo.SizeLine" autocreate="true" generate="true">
<deployment typecode="10504" table="test_size_line" />
<custom-properties>
<!-- marking the type as synchronizing capable here: -->
<property name="catalogItemType">
<value>java.lang.Boolean.TRUE</value>
</property>
<property name="catalogVersionAttributeQualifier">
<value>"catalogVersion"</value>
</property>
<!-- define unique key attributes here; separate multiple attribute qualifiers by commas: -->
<property name="uniqueKeyAttributeQualifier">
<value>"pk"</value>
</property>
</custom-properties>
<attributes>
<attribute qualifier="catalogVersion" type="CatalogVersion">
<modifiers read="true" write="true" search="true" optional="false" />
<persistence type="property" />
</attribute>
<attribute qualifier="width" type="java.lang.Integer">
<modifiers read="true" write="true" search="true" optional="true" />
<persistence type="property" />
</attribute>
<attribute qualifier="height" type="java.lang.Integer">
<modifiers read="true" write="true" search="true" optional="true" />
<persistence type="property" />
</attribute>
<attribute qualifier="depth" type="java.lang.Integer">
<modifiers read="true" write="true" search="true" optional="true" />
<persistence type="property" />
</attribute>
<attribute qualifier="weight" type="java.lang.Integer">
<modifiers read="true" write="true" search="true" optional="true" />
<persistence type="property" />
</attribute>
</attributes>
</itemtype>
<itemtype code="EAN" jaloclass="org.myproject.jalo.EAN" extends="Product" autocreate="true" generate="true">
<attributes>
<attribute qualifier="productSize" type="SizeLine">
<modifiers read="true" write="true" search="true" optional="true" />
<persistence type="property" />
</attribute>
</attributes>
</itemtype>
</itemtypes>
</items>
Test code:
ModelService modelService = Registry.getApplicationContext().getBean("modelService", ModelService.class);
CatalogVersionModel catalogVersion = modelService.get(PK.fromLong(8796093088345l));
UnitModel unit = modelService.get(PK.fromLong(8796093054986l));
UnitLineModel unitLine = modelService.create(UnitLineModel.class);
unitLine.setCatalogVersion(catalogVersion);
unitLine.setAmount(1d);
unitLine.setUnit(unit);
SizeLineModel sizeLine = modelService.create(SizeLineModel.class);
sizeLine.setCatalogVersion(catalogVersion);
sizeLine.setWidth(10);
sizeLine.setDepth(10);
sizeLine.setHeight(10);
sizeLine.setWeight(10);
EANModel ean = modelService.create(EANModel.class);
ean.setCode("testean");
ean.setProductSize(sizeLine);
ean.setContent(Sets.newHashSet(unitLine));
modelService.save(ean);
Exception:
de.hybris.platform.servicelayer.interceptor.InterceptorException: [de.hybris.platform.product.impl.UniqueCatalogItemInterceptor@7230d1e8]:unique keys {pk=null} of UnitLineModel () are ambiguous in version Default/Staged at de.hybris.platform.product.impl.UniqueCatalogItemInterceptor.onValidate(UniqueCatalogItemInterceptor.java:95) at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.invokeValidateInterceptors(ModelWrapper.java:291) at de.hybris.platform.servicelayer.internal.model.impl.wrapper.ModelWrapper.validate(ModelWrapper.java:239) at de.hybris.platform.servicelayer.internal.model.extractor.impl.DefaultModelExtractor.process(DefaultModelExtractor.java:58) at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.performPersistenceOperations(DefaultModelService.java:711) at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAllInternal(DefaultModelService.java:706) at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.saveAll(DefaultModelService.java:686) at de.hybris.platform.servicelayer.internal.model.impl.DefaultModelService.save(DefaultModelService.java:634) at org.apache.jsp.test_jsp._jspService(test_jsp.java:106) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at de.hybris.platform.servicelayer.web.AbstractPlatformFilterChain$InternalFilterChain.doFilter(AbstractPlatformFilterChain.java:254) at de.hybris.platform.servicelayer.web.AbstractPlatformFilterChain$StatisticsGatewayFilter.doFilter(AbstractPlatformFilterChain.java:343) at de.hybris.platform.servicelayer.web.AbstractPlatformFilterChain$InternalFilterChain.doFilter(AbstractPlatformFilterChain.java:224) at de.hybris.platform.servicelayer.web.WebAppMediaFilter.doFilter(WebAppMediaFilter.java:133) at de.hybris.platform.servicelayer.web.AbstractPlatformFilterChain$InternalFilterChain.doFilter(AbstractPlatformFilterChain.java:224) at de.hybris.platform.servicelayer.web.SessionFilter.doFilter(SessionFilter.java:71) at de.hybris.platform.servicelayer.web.AbstractPlatformFilterChain$InternalFilterChain.doFilter(AbstractPlatformFilterChain.java:224) at de.hybris.platform.servicelayer.web.Log4JFilter.doFilter(Log4JFilter.java:45) at de.hybris.platform.servicelayer.web.AbstractPlatformFilterChain$InternalFilterChain.doFilter(AbstractPlatformFilterChain.java:224) at de.hybris.platform.servicelayer.web.AbstractPlatformFilterChain.doFilterInternal(AbstractPlatformFilterChain.java:154) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at de.hybris.platform.servicelayer.web.XSSFilter.processPatternsAndDoFilter(XSSFilter.java:293) at de.hybris.platform.servicelayer.web.XSSFilter.doFilter(XSSFilter.java:247) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)