Doctrine2 Merge() 因复合索引而失败教义2错误?

Posted

技术标签:

【中文标题】Doctrine2 Merge() 因复合索引而失败教义2错误?【英文标题】:Doctrine2 Merge() Fails with Composite Indexes | Doctrine2 Bug? 【发布时间】:2013-12-15 06:11:06 【问题描述】:

当我合并以下使用复合索引的分离 UserAnswer 对象时,合并失败当且仅当我的索引具有 both 外键/映射实体 和对象中的非外键/映射实体。如果复合索引仅包含外键或仅包含非外键,则合并有效。

我认为这是一个 Doctrine2 错误。如果没有,我做错了什么?

Doctrine2 版本:2.3.4

下面的控制器代码保存了一个UserAnswer对象类型,如下代码块所述:

$entityManager = $this->getDoctrine()->getManager();

$userAnswer = new UserAnswer();
$userAnswer->setUser($this->getUser());
$userAnswer->setAnswerType(1);
$userAnswer->setQuestion($entityManager->getReference('AcmeBundle:Question',1));

$entityManager->detach($userAnswer);
$entityManager->merge($userAnswer);
try 
    $entityManager->flush();
 catch (\Doctrine\DBAL\DBALException $e) 
...

UserAnswer 对象:

/**
 * @ORM\Entity
 * @ORM\Table(name="userAnswers")
 */
class UserAnswer

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="User")
     */
    protected $user;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Question")
     */
    protected $question;

    /**
     * @ORM\Id
     * @ORM\Column(name="answer_type", type="integer")
     */
    protected $answer_type;
...

这是我收到的错误:

对于以下查询,缺少标识符 answer_type AcmeBundle\Entity\UserAnswer

500 内部服务器错误 - ORMException

堆栈跟踪

在 /vagrant/Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/ORMException.php 在第 160 行 -

public static function missingIdentifierField($className, $fieldName)

    return new self("The identifier $fieldName is missing for a query of " . $className);


public static function overwriteInternalDQLFunctionNotAllowed($functionName)

在 /vagrant/Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php 第 380 行的 ORMException::missingIdentifierField ('Acme\Entity\UserAnswer','answer_type') +

在 EntityManager ->find('Acme\Entity\UserAnswer', array('user' => '1','question' => '1')) 在 /vagrant/Symfony/vendor/doctrine/orm/ lib/Doctrine/ORM/UnitOfWork.php 第 1787 行 +

在 UnitOfWork ->doMerge (object(UserAnswer), array('0000000025cf9503000000006ed40a0a' => object(UserAnswer))) 在 /vagrant/Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php 在行1701 +

在 UnitOfWork ->merge (object(UserAnswer)) in /vagrant/Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php 第 638 行 +

在 EntityManager ->merge (object(UserAnswer)) in /vagrant/Symfony/src/Acme/Controller/UserAnswerController.php 第 23 行 +

在 UserAnswerController -> postAction () at call_user_func_array (array(object(UserAnswerController), 'postAction'), array()) in kernel.root_dir/bootstrap.php.cache at line 2815 +

在 HttpKernel ->handleRaw (object(Request), '1') in kernel.root_dir/bootstrap.php.cache at line 2789 +

在 HttpKernel->handle (object(Request), '1', true) in kernel.root_dir/bootstrap.php.cache at line 2918 +

在 ContainerAwareHttpKernel ->handle (object(Request), '1', true) in kernel.root_dir/bootstrap.php.cache at line 2220 +

at Kernel->handle (object(Request)) in /vagrant/Symfony/web/app_dev.php at line 31 +

这个 UserAnswer 确实不会产生上述控制器代码的错误:

/**
 * @ORM\Entity
 * @ORM\Table(name="userAnswers")
 */
class UserAnswer

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="User")
     */
    protected $user;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Question")
     */
    protected $question;

    /**
     * @ORM\Column(name="answer_type", type="integer")
     */
    protected $answer_type;
...

这个也没有:

/**
 * @ORM\Entity
 * @ORM\Table(name="userAnswers")
 */
class UserAnswer extends ApiObject

    /**
     * @ORM\Id
     * @ORM\Column(name="userid", type="integer")
     */
    protected $userid;

    /**
     * @ORM\Id
     * @ORM\Column(name="question_id", type="integer")
     */
    protected $question_id;

    /**
     * @ORM\Id
     * @ORM\Column(name="answer_type", type="integer")
     */
    protected $answer_type;
...

【问题讨论】:

【参考方案1】:

一个 Doctrine2 错误,并在 Doctrine 版本 2.4.2 中得到修复,在撰写本文时该版本尚未发布。 (见http://www.doctrine-project.org/jira/browse/DDC-2645。)

但是,修复非常易于实施:https://github.com/Exeu/doctrine2/commit/edab2b6a9670dda3127f457205c7720611d6a6c9

【讨论】:

【参考方案2】:

看起来这可能与已知的 Doctrine 问题有关,并已在 2.3.4 版中修复:

http://www.doctrine-project.org/jira/browse/DDC-2645

【讨论】:

以上是关于Doctrine2 Merge() 因复合索引而失败教义2错误?的主要内容,如果未能解决你的问题,请参考以下文章

在 merge() 操作中丢失复合外键(JPA/Hibernate)

Symfony2 / Doctrine2:不要在模式上删除全文索引:更新

Symfony3 / Doctrine2 中 $em->clear() 时出现未定义索引错误

为啥@jdbc 查询因连接超时而失败?

Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面索引行复合索引中的一个切面

关于MySQL复合索引的使用方法有哪些?