Single id is not allowed on composite primary key in entity

any thoughts… v2026

Doctrine\ORM\Mapping\MappingException:
Single id is not allowed on composite primary key in entity PHPMaker2026\appname\Db\Entity\TblPicklistOption
at /srv/www/htdocs/appname/vendor/doctrine/orm/src/Mapping/MappingException.php:302
at Doctrine\ORM\Mapping\MappingException::singleIdNotAllowedOnCompositePrimaryKey() (/srv/www/htdocs/appname/vendor/doctrine/orm/src/Mapping/ClassMetadata.php:1477)

  1. What is the table schema of your table “TblPicklistOptions”? Post for reproducing the error.
  2. When did the error occur? Post complete stach trace.

trying to get more details on why no routes are being found..

i have 4 tables throwing the same error, disabled the all 4, but this particular one it continues to generate.TblPicklistOption (table: tbl_picklist_options)

on generation:

Stack trace:
#0 C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\ClassMetadata.php(1477): Doctrine\ORM\Mapping\MappingException::singleIdNotAllowedOnCompositePrimaryKey('PHPMaker2026\\Do...')
#1 C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\ClassMetadataFactory.php(557): Doctrine\ORM\Mapping\ClassMetadata->getSingleIdentifierFieldName()
#2 C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\ClassMetadataFactory.php(178): Doctrine\ORM\Mapping\ClassMetadataFactory->completeIdGeneratorMapping(Object(Doctrine\ORM\Mapping\ClassMetadata))
#3 C:\xampp\htdocs\APPNAME\vendor\doctrine\doctrine-bundle\src\Mapping\ClassMetadataFactory.php(20): Doctrine\ORM\Mapping\ClassMetadataFactory->doLoadMetadata(Object(Doctrine\ORM\Mapping\ClassMetadata), NULL, false, Array)
#4 C:\xampp\htdocs\APPNAME\vendor\doctrine\persistence\src\Persistence\Mapping\AbstractClassMetadataFactory.php(318): Doctrine\Bundle\DoctrineBundle\Mapping\ClassMetadataFactory->doLoadMetadata(Object(Doctrine\ORM\Mapping\ClassMetadata), NULL, false, Array)
#5 C:\xampp\htdocs\APPNAME\vendor\doctrine\persistence\src\Persistence\Mapping\AbstractClassMetadataFactory.php(187): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->loadMetadata('PHPMaker2026\\Do...')
#6 C:\xampp\htdocs\APPNAME\vendor\doctrine\persistence\src\Persistence\Mapping\AbstractClassMetadataFactory.php(88): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->getMetadataFor('PHPMaker2026\\Do...')
#7 C:\xampp\htdocs\APPNAME\vendor\symfony\doctrine-bridge\CacheWarmer\ProxyCacheWarmer.php(60): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->getAllMetadata()
#8 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\CacheWarmer\CacheWarmerAggregate.php(96): Symfony\Bridge\Doctrine\CacheWarmer\ProxyCacheWarmer->warmUp('C:\\xampp\\htdocs...', 'C:\\xampp\\htdocs...')
#9 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\Kernel.php(546): Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate->warmUp('C:\\xampp\\htdocs...', 'C:\\xampp\\htdocs...')
#10 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\Kernel.php(744): Symfony\Component\HttpKernel\Kernel->initializeContainer()
#11 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\Kernel.php(120): Symfony\Component\HttpKernel\Kernel->preBoot()
#12 C:\xampp\htdocs\APPNAME\src\Kernel.php(46): Symfony\Component\HttpKernel\Kernel->boot()
#13 C:\xampp\htdocs\APPNAME\bin\console(35): PHPMaker2026\APPNAME\Kernel->boot()
#14 {main}
  thrown in C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\MappingException.php on line 302
Fatal error: Uncaught Doctrine\ORM\Mapping\MappingException: Single id is not allowed on composite primary key in entity PHPMaker2026\APPNAME\Db\Entity\TblPicklistOption in C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\MappingException.php:302
Stack trace:
#0 C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\ClassMetadata.php(1477): Doctrine\ORM\Mapping\MappingException::singleIdNotAllowedOnCompositePrimaryKey('PHPMaker2026\\Do...')
#1 C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\ClassMetadataFactory.php(557): Doctrine\ORM\Mapping\ClassMetadata->getSingleIdentifierFieldName()
#2 C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\ClassMetadataFactory.php(178): Doctrine\ORM\Mapping\ClassMetadataFactory->completeIdGeneratorMapping(Object(Doctrine\ORM\Mapping\ClassMetadata))
#3 C:\xampp\htdocs\APPNAME\vendor\doctrine\doctrine-bundle\src\Mapping\ClassMetadataFactory.php(20): Doctrine\ORM\Mapping\ClassMetadataFactory->doLoadMetadata(Object(Doctrine\ORM\Mapping\ClassMetadata), NULL, false, Array)
#4 C:\xampp\htdocs\APPNAME\vendor\doctrine\persistence\src\Persistence\Mapping\AbstractClassMetadataFactory.php(318): Doctrine\Bundle\DoctrineBundle\Mapping\ClassMetadataFactory->doLoadMetadata(Object(Doctrine\ORM\Mapping\ClassMetadata), NULL, false, Array)
#5 C:\xampp\htdocs\APPNAME\vendor\doctrine\persistence\src\Persistence\Mapping\AbstractClassMetadataFactory.php(187): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->loadMetadata('PHPMaker2026\\Do...')
#6 C:\xampp\htdocs\APPNAME\vendor\doctrine\persistence\src\Persistence\Mapping\AbstractClassMetadataFactory.php(88): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->getMetadataFor('PHPMaker2026\\Do...')
#7 C:\xampp\htdocs\APPNAME\vendor\symfony\doctrine-bridge\CacheWarmer\ProxyCacheWarmer.php(60): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->getAllMetadata()
#8 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\CacheWarmer\CacheWarmerAggregate.php(96): Symfony\Bridge\Doctrine\CacheWarmer\ProxyCacheWarmer->warmUp('C:\\xampp\\htdocs...', 'C:\\xampp\\htdocs...')
#9 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\Kernel.php(546): Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate->warmUp('C:\\xampp\\htdocs...', 'C:\\xampp\\htdocs...')
#10 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\Kernel.php(744): Symfony\Component\HttpKernel\Kernel->initializeContainer()
#11 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\Kernel.php(120): Symfony\Component\HttpKernel\Kernel->preBoot()
#12 C:\xampp\htdocs\APPNAME\src\Kernel.php(46): Symfony\Component\HttpKernel\Kernel->boot()
#13 C:\xampp\htdocs\APPNAME\bin\console(35): PHPMaker2026\APPNAME\Kernel->boot()
#14 {main}
  thrown in C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\MappingException.php on line 302
Error: Command failed: php -d memory_limit=-1 bin/console app:cache:warmup-language --no-interaction
    at genericNodeError (node:internal/errors:983:15)
    at wrappedFn (node:internal/errors:537:14)
    at checkExecSyncError (node:child_process:916:11)
    at execSync (node:child_process:988:15)
    at global.Exec (C:\Users\peter\AppData\Roaming\PHPMaker2026\node_modules\@phpmaker\core\phpmaker.js:8:394311)
    at global.RunConsoleCommand (C:\Users\peter\AppData\Roaming\PHPMaker2026\node_modules\@phpmaker\core\phpmaker.js:8:393430)
    at global.WarmUpLanguage (C:\Users\peter\AppData\Roaming\PHPMaker2026\node_modules\@phpmaker\core\phpmaker.js:8:393541)
    at global.ClearCache (C:\Users\peter\AppData\Roaming\PHPMaker2026\node_modules\@phpmaker\core\phpmaker.js:8:393611)
    at C:\Users\peter\AppData\Roaming\PHPMaker2026\node_modules\@phpmaker\core\phpmaker.js:8:420047
    at <anonymous> {
  status: 255,
  signal: null,
  output: [ null, null, null ],
  pid: 22480,
  stdout: null,
  stderr: null
}
Running php -d memory_limit=-1 bin/console cache:clear --env=dev --no-debug
DBG requires Zend Engine API version 420230831.
The Zend Engine API version 420220829 which is installed, is outdated.
PHP Fatal error:  Uncaught Doctrine\ORM\Mapping\MappingException: Single id is not allowed on composite primary key in entity PHPMaker2026\APPNAME\Db\Entity\TblPicklistOption in C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\MappingException.php:302
Stack trace:
#0 C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\ClassMetadata.php(1477): Doctrine\ORM\Mapping\MappingException::singleIdNotAllowedOnCompositePrimaryKey('PHPMaker2026\\Do...')
#1 C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\ClassMetadataFactory.php(557): Doctrine\ORM\Mapping\ClassMetadata->getSingleIdentifierFieldName()
#2 C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\ClassMetadataFactory.php(178): Doctrine\ORM\Mapping\ClassMetadataFactory->completeIdGeneratorMapping(Object(Doctrine\ORM\Mapping\ClassMetadata))
#3 C:\xampp\htdocs\APPNAME\vendor\doctrine\doctrine-bundle\src\Mapping\ClassMetadataFactory.php(20): Doctrine\ORM\Mapping\ClassMetadataFactory->doLoadMetadata(Object(Doctrine\ORM\Mapping\ClassMetadata), NULL, false, Array)
#4 C:\xampp\htdocs\APPNAME\vendor\doctrine\persistence\src\Persistence\Mapping\AbstractClassMetadataFactory.php(318): Doctrine\Bundle\DoctrineBundle\Mapping\ClassMetadataFactory->doLoadMetadata(Object(Doctrine\ORM\Mapping\ClassMetadata), NULL, false, Array)
#5 C:\xampp\htdocs\APPNAME\vendor\doctrine\persistence\src\Persistence\Mapping\AbstractClassMetadataFactory.php(187): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->loadMetadata('PHPMaker2026\\Do...')
#6 C:\xampp\htdocs\APPNAME\vendor\doctrine\persistence\src\Persistence\Mapping\AbstractClassMetadataFactory.php(88): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->getMetadataFor('PHPMaker2026\\Do...')
#7 C:\xampp\htdocs\APPNAME\vendor\symfony\doctrine-bridge\CacheWarmer\ProxyCacheWarmer.php(60): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->getAllMetadata()
#8 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\CacheWarmer\CacheWarmerAggregate.php(96): Symfony\Bridge\Doctrine\CacheWarmer\ProxyCacheWarmer->warmUp('C:\\xampp\\htdocs...', 'C:\\xampp\\htdocs...')
#9 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\Kernel.php(546): Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate->warmUp('C:\\xampp\\htdocs...', 'C:\\xampp\\htdocs...')
#10 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\Kernel.php(744): Symfony\Component\HttpKernel\Kernel->initializeContainer()
#11 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\Kernel.php(120): Symfony\Component\HttpKernel\Kernel->preBoot()
#12 C:\xampp\htdocs\APPNAME\src\Kernel.php(46): Symfony\Component\HttpKernel\Kernel->boot()
#13 C:\xampp\htdocs\APPNAME\bin\console(35): PHPMaker2026\APPNAME\Kernel->boot()
#14 {main}
  thrown in C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\MappingException.php on line 302
Fatal error: Uncaught Doctrine\ORM\Mapping\MappingException: Single id is not allowed on composite primary key in entity PHPMaker2026\APPNAME\Db\Entity\TblPicklistOption in C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\MappingException.php:302
Stack trace:
#0 C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\ClassMetadata.php(1477): Doctrine\ORM\Mapping\MappingException::singleIdNotAllowedOnCompositePrimaryKey('PHPMaker2026\\Do...')
#1 C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\ClassMetadataFactory.php(557): Doctrine\ORM\Mapping\ClassMetadata->getSingleIdentifierFieldName()
#2 C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\ClassMetadataFactory.php(178): Doctrine\ORM\Mapping\ClassMetadataFactory->completeIdGeneratorMapping(Object(Doctrine\ORM\Mapping\ClassMetadata))
#3 C:\xampp\htdocs\APPNAME\vendor\doctrine\doctrine-bundle\src\Mapping\ClassMetadataFactory.php(20): Doctrine\ORM\Mapping\ClassMetadataFactory->doLoadMetadata(Object(Doctrine\ORM\Mapping\ClassMetadata), NULL, false, Array)
#4 C:\xampp\htdocs\APPNAME\vendor\doctrine\persistence\src\Persistence\Mapping\AbstractClassMetadataFactory.php(318): Doctrine\Bundle\DoctrineBundle\Mapping\ClassMetadataFactory->doLoadMetadata(Object(Doctrine\ORM\Mapping\ClassMetadata), NULL, false, Array)
#5 C:\xampp\htdocs\APPNAME\vendor\doctrine\persistence\src\Persistence\Mapping\AbstractClassMetadataFactory.php(187): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->loadMetadata('PHPMaker2026\\Do...')
#6 C:\xampp\htdocs\APPNAME\vendor\doctrine\persistence\src\Persistence\Mapping\AbstractClassMetadataFactory.php(88): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->getMetadataFor('PHPMaker2026\\Do...')
#7 C:\xampp\htdocs\APPNAME\vendor\symfony\doctrine-bridge\CacheWarmer\ProxyCacheWarmer.php(60): Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->getAllMetadata()
#8 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\CacheWarmer\CacheWarmerAggregate.php(96): Symfony\Bridge\Doctrine\CacheWarmer\ProxyCacheWarmer->warmUp('C:\\xampp\\htdocs...', 'C:\\xampp\\htdocs...')
#9 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\Kernel.php(546): Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate->warmUp('C:\\xampp\\htdocs...', 'C:\\xampp\\htdocs...')
#10 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\Kernel.php(744): Symfony\Component\HttpKernel\Kernel->initializeContainer()
#11 C:\xampp\htdocs\APPNAME\vendor\symfony\http-kernel\Kernel.php(120): Symfony\Component\HttpKernel\Kernel->preBoot()
#12 C:\xampp\htdocs\APPNAME\src\Kernel.php(46): Symfony\Component\HttpKernel\Kernel->boot()
#13 C:\xampp\htdocs\APPNAME\bin\console(35): PHPMaker2026\APPNAME\Kernel->boot()
#14 {main}
  thrown in C:\xampp\htdocs\APPNAME\vendor\doctrine\orm\src\Mapping\MappingException.php on line 302
Error: Command failed: php -d memory_limit=-1 bin/console cache:clear --env=dev --no-debug
    at genericNodeError (node:internal/errors:983:15)
    at wrappedFn (node:internal/errors:537:14)
    at checkExecSyncError (node:child_process:916:11)
    at execSync (node:child_process:988:15)
    at global.Exec (C:\Users\peter\AppData\Roaming\PHPMaker2026\node_modules\@phpmaker\core\phpmaker.js:8:394311)
    at global.ClearCache (C:\Users\peter\AppData\Roaming\PHPMaker2026\node_modules\@phpmaker\core\phpmaker.js:8:393762)
    at C:\Users\peter\AppData\Roaming\PHPMaker2026\node_modules\@phpmaker\core\phpmaker.js:8:420047
    at <anonymous>
    at async main (C:\Users\peter\AppData\Roaming\PHPMaker2026\node_modules\@phpmaker\core\phpmaker.js:8:419524) {
  status: 255,
  signal: null,
  output: [ null, null, null ],
  pid: 20728,
  stdout: null,
  stderr: null
}
Deleting C:\xampp\htdocs\APPNAME\var\cache\dev...
C:\xampp\htdocs\APPNAME\var\cache\dev deleted
Error: Generation completed with error(s), please scroll up (if necessary) to check error(s).

CREATE TABLE `tbl_picklist_options` (
  `tenantId` int(11) NOT NULL DEFAULT 0,
  `picklist_Key` int(11) NOT NULL AUTO_INCREMENT,
  `picklist_master_key` int(11) DEFAULT NULL,
  `picklist_Id` varchar(31) NOT NULL DEFAULT '',
  `picklist_Text` varchar(255) NOT NULL DEFAULT '',
  `picklist_Value` int(11) NOT NULL DEFAULT 0,
  `picklist_Display_Order` int(11) DEFAULT 0,
  `UserId` int(11) DEFAULT NULL,
  `DateCreated` datetime DEFAULT current_timestamp(),
  `CreatedBy` int(11) DEFAULT NULL,
  `LastModified` datetime DEFAULT NULL,
  `ModifiedBy` int(11) DEFAULT NULL,
  UNIQUE KEY `picklist_id_UNIQUE` (`tenantId`,`picklist_Id`,`picklist_Text`),
  UNIQUE KEY `picklist_tenant_UNIQUE` (`tenantId`,`picklist_Key`),
  KEY `picklist_Value` (`picklist_Value`),
  KEY `fk_visitor_types_idx` (`picklist_Id`,`picklist_Value`),
  KEY `picklist_Key_INDEX` (`picklist_Key`),
  KEY `fk_pl_businesses_tenantId_idx` (`tenantId`),
  KEY `fk_pl_membershipUserId_idx` (`UserId`),
  CONSTRAINT `fk_pl_business_tenantId` FOREIGN KEY (`tenantId`) REFERENCES `businesses` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_pl_membershipUserId` FOREIGN KEY (`UserId`) REFERENCES `tbl_sys_membership` (`UserId`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=5565 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

this is causing the generation to fail, i suspect, which is then cascading issues we are having

here are 3 other tables with composite primary keys:

CREATE TABLE `tbl_sys_country_codes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `geoname_id` int(11) NOT NULL,
  `country_iso_code` varchar(255) DEFAULT NULL,
  `country_name` varchar(255) DEFAULT NULL,
  `UserId` int(11) DEFAULT NULL,
  `DateCreated` datetime DEFAULT current_timestamp(),
  `CreatedBy` int(11) DEFAULT NULL,
  `LastModified` datetime DEFAULT NULL,
  `ModifiedBy` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`,`geoname_id`),
  UNIQUE KEY `ID_UNIQUE` (`id`),
  UNIQUE KEY `geoname_id_UNIQUE` (`geoname_id`)
) ENGINE=InnoDB AUTO_INCREMENT=738 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `tbl_sys_region_city_codes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `geoname_id` int(11) NOT NULL,
  `country_iso_code` varchar(255) DEFAULT NULL,
  `subdivision_1_iso_code` varchar(255) DEFAULT NULL,
  `city_name` varchar(255) DEFAULT NULL,
  `UserId` int(11) DEFAULT NULL,
  `DateCreated` datetime DEFAULT current_timestamp(),
  `CreatedBy` int(11) DEFAULT NULL,
  `LastModified` datetime DEFAULT NULL,
  `ModifiedBy` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`,`geoname_id`),
  UNIQUE KEY `geoname_id_UNIQUE` (`geoname_id`),
  UNIQUE KEY `ID_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=192982 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE `tbl_sys_region_codes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `geoname_id` int(11) NOT NULL,
  `country_iso_code` varchar(255) DEFAULT NULL,
  `subdivision_1_iso_code` varchar(255) DEFAULT NULL,
  `subdivision_1_name` varchar(255) DEFAULT NULL,
  `UserId` int(11) DEFAULT NULL,
  `DateCreated` datetime DEFAULT current_timestamp(),
  `CreatedBy` int(11) DEFAULT NULL,
  `LastModified` datetime DEFAULT NULL,
  `ModifiedBy` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`,`geoname_id`),
  UNIQUE KEY `geoname_id_UNIQUE` (`geoname_id`),
  UNIQUE KEY `ID_UNIQUE` (`id`),
  KEY `id_country_iso_code` (`country_iso_code`),
  KEY `ID_subdivision_1_iso_code` (`subdivision_1_iso_code`)
) ENGINE=InnoDB AUTO_INCREMENT=178456 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

Yes, also the same.

Doctrine ORM does support composite key. However, single id is not allowed on composite primary key in entity. For example, your table schema contains:

`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`,`geoname_id`),

Doctrine detects:

  • id has AUTO_INCREMENT => single primary key.
  • But your PRIMARY KEY is (id, geoname_id) => composite key.
  • Doctrine does not allow an auto-generated field inside a composite key.

Since id already uses AUTO_INCREMENT, it’s best to use single id primary key. If you must use composite key, it is better to use it like the orderdetails table in the demo project (i.e. no autoincrement field in composite key or unique key):

CREATE TABLE IF NOT EXISTS `orderdetails` (
  `OrderID` int NOT NULL,
  `ProductID` int NOT NULL,
  `UnitPrice` double NOT NULL DEFAULT '0',
  `Quantity` smallint NOT NULL DEFAULT '1',
  `Discount` double NOT NULL DEFAULT '0',
  PRIMARY KEY (`OrderID`,`ProductID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;