Мы заметили в Intershop DB, что с момента перехода с версии 7.9 на 7.10 индексы для альтернативных ключей не генерируются как UNIQUE INDEX.Это приводит к тому, что все таблицы, содержащие альтернативные ключи (системные и пользовательские объекты), генерируются с индексами NONUNIQUE в базе данных.Например:
Также сгенерирован код файла .ddl (CatalogCategoryLinkPO.dbindex.oracle.ddl):
/*
=============================================================================
File: CatalogCategoryLinkPO.dbindex.oracle.ddl
Generated by JGen Code Generator from INTERSHOP Communications AG.
=============================================================================
The JGen Code Generator software is the property of INTERSHOP Communications AG.
Any rights to use are granted under the license agreement.
=============================================================================
*/
SET ECHO ON
SET SERVEROUTPUT ON SIZE 1000000
VARIABLE table_space VARCHAR2(50)
VARIABLE recreate_indexes NUMBER;
EXEC :table_space := '&index_tablespace';
EXEC :recreate_indexes := '&recreate_indexes';
PROMPT /* Class com.intershop.beehive.xcs.internal.catalog.CatalogCategoryLinkPO */
PROMPT -- Foreign key indices
EXEC staging_ddl.create_index('CATALOGCATEGORYLINK_FK999', 'CATALOGCATEGORYLINK', '(TARGETCATEGORYID)', :table_space, 'NONUNIQUE', :recreate_indexes);
EXEC staging_ddl.create_index('CATALOGCATEGORYLINK_FK998', 'CATALOGCATEGORYLINK', '(SOURCECATEGORYID)', :table_space, 'NONUNIQUE', :recreate_indexes);
PROMPT -- Foreign key indices (dependencies)
EXEC staging_ddl.create_index('CATALOGCATEGORYLINK_FK997', 'CATALOGCATEGORYLINK', '(DOMAINID)', :table_space, 'NONUNIQUE', :recreate_indexes);
PROMPT -- Inversion Entry key indices
EXEC staging_ddl.create_index('CATALOGCATEGORYLINK_IE001', 'CATALOGCATEGORYLINK', '(TYPECODE)', :table_space, 'NONUNIQUE', :recreate_indexes);
EXEC staging_ddl.create_index('CATALOGCATEGORYLINK_IE002', 'CATALOGCATEGORYLINK', '(SOURCECATEGORYID,TARGETCATEGORYID,DOMAINID,TYPECODE)', :table_space, 'UNIQUE', :recreate_indexes);
PROMPT -- Searchable attribute indices
EXEC staging_ddl.create_index('CATALOGCATEGORYLINK_IE999', 'CATALOGCATEGORYLINK', '(DOMAINID)', :table_space, 'NONUNIQUE', :recreate_indexes);
EXEC staging_ddl.create_index('CATALOGCATEGORYLINK_AK001', 'CATALOGCATEGORYLINK', '(SOURCECATEGORYID,TARGETCATEGORYID,DOMAINID,TYPECODE)', :table_space, 'NONUNIQUE', :recreate_indexes);
PROMPT /* Class com.intershop.beehive.xcs.internal.catalog.CatalogCategoryLinkPOAttributeValue */
PROMPT -- Foreign key indices
EXEC staging_ddl.create_index('CATALOGCATEGORYLINK_AV_FK002', 'CATALOGCATEGORYLINK_AV', '(ownerID)', :table_space, 'NONUNIQUE', :recreate_indexes);
PROMPT -- Inversion Entry key indices
EXEC staging_ddl.create_index('CATALOGCATEGORYLINK_AV_IE002', 'CATALOGCATEGORYLINK_AV', '(intValue)', :table_space, 'NONUNIQUE', :recreate_indexes);
EXEC staging_ddl.create_index('CATALOGCATEGORYLINK_AV_IE003', 'CATALOGCATEGORYLINK_AV', '(doubleValue)', :table_space, 'NONUNIQUE', :recreate_indexes);
То же самое происходит, когда мы пытаемся создать альтернативный ключ для наших собственных реализованных объектов.Например, это фрагмент кода .edl:
orm class A1PromotionBenefitPO extends PersistentObjectPO implements A1PromotionBenefit table "A1PromotionBenefit"
{
/**
* Declare alternate key.
*/
alternate key (promotionUUID, tariffUUID, contractType, contractBinding, domainID);
/**
* Holds link to tariff.
*/
attribute tariffUUID : uuid required searchable;
/**
* Holds link to promotion.
*/
attribute promotionUUID: uuid required;
....
...
И это сгенерированный файл .ddl (A1PromotionBenefitPO.dbindex.oracle.ddl):
/*
=============================================================================
File: A1PromotionBenefitPO.dbindex.oracle.ddl
Generated by JGen Code Generator from INTERSHOP Communications AG.
=============================================================================
The JGen Code Generator software is the property of INTERSHOP Communications AG.
Any rights to use are granted under the license agreement.
=============================================================================
*/
SET ECHO ON
SET SERVEROUTPUT ON SIZE 1000000
VARIABLE table_space VARCHAR2(50)
VARIABLE recreate_indexes NUMBER;
EXEC :table_space := '&index_tablespace';
EXEC :recreate_indexes := '&recreate_indexes';
PROMPT /* Class hr.a1.orm.promotion.internal.A1PromotionBenefitPO */
PROMPT -- Foreign key indices
EXEC staging_ddl.create_index('A1PROMOTIONBENEFIT_FK999', 'A1PROMOTIONBENEFIT', '(DISCOUNTUUID)', :table_space, 'NONUNIQUE', :recreate_indexes);
EXEC staging_ddl.create_index('A1PROMOTIONBENEFIT_FK998', 'A1PROMOTIONBENEFIT', '(PROMOTIONUUID)', :table_space, 'NONUNIQUE', :recreate_indexes);
PROMPT -- Foreign key indices (dependencies)
EXEC staging_ddl.create_index('A1PROMOTIONBENEFIT_FK997', 'A1PROMOTIONBENEFIT', '(DOMAINID)', :table_space, 'NONUNIQUE', :recreate_indexes);
EXEC staging_ddl.create_index('A1PROMOTIONBENEFIT_FK996', 'A1PROMOTIONBENEFIT', '(TARIFFUUID)', :table_space, 'NONUNIQUE', :recreate_indexes);
PROMPT -- Inversion Entry key indices
EXEC staging_ddl.create_index('A1PROMOTIONBENEFIT_IE001', 'A1PROMOTIONBENEFIT', '(PROMOTIONUUID,TARIFFUUID,CONTRACTTYPE,CONTRACTBINDING,DOMAINID)', :table_space, 'UNIQUE', :recreate_indexes);
PROMPT -- Searchable attribute indices
EXEC staging_ddl.create_index('A1PROMOTIONBENEFIT_IE999', 'A1PROMOTIONBENEFIT', '(DOMAINID)', :table_space, 'NONUNIQUE', :recreate_indexes);
EXEC staging_ddl.create_index('A1PROMOTIONBENEFIT_IE998', 'A1PROMOTIONBENEFIT', '(TARIFFUUID)', :table_space, 'NONUNIQUE', :recreate_indexes);
EXEC staging_ddl.create_index('A1PROMOTIONBENEFIT_AK001', 'A1PROMOTIONBENEFIT', '(PROMOTIONUUID,TARIFFUUID,CONTRACTTYPE,CONTRACTBINDING,DOMAINID)', :table_space, 'NONUNIQUE', :recreate_indexes);
Как вы можетесм. индекс альтернативного ключа A1PROMOTIONBENEFIT_AK001 генерируется как NONUNIQUE.
Знаете ли вы, почему это происходит?Наш код зависит от альтернативных ключей, поэтому мы не хотели бы полностью удалить альтернативные ключи из нашей модели orm.