2011-06-20 19 views
5

doctrine 1.2から2.xへの切り替えを行っていて、奇妙な問題に遭遇しています。doctrine 2 persistは、更新する代わりに既存のアイテムを挿入しようとします

は私がBuildingBlock実体を指し、属性$ buildingBlockを持っているエンティティCompositionRuleを持っています。

私はこの属性を設定して、データベースからフェッチする既存のBuildingBlockを指しています。

メインオブジェクト(CompositionRule)を永続化すると、entitymanagerは新しいBuildingBlockアイテムを作成し、それが既に存在することを受け入れて無視するのではなく、データベースに挿入しようとします。

$ entity-> save();を実行したときにdoctrine 1.2のように私がここで紛失していることはありません。すべての基礎となるオブジェクトが正しく処理されました。ここで

が私のマッピング/コードの一部は次のとおりです。

CompositionRule:

<many-to-one field="buildingBlock" target-entity="BuildingBlock"> 
    <cascade><cascade-all /></cascade> 
</many-to-one> 
.. 
public function setBuildingBlock($buildingBlock) { 
    $buildingBlock->addCompositionRule($this); 
    $this->buildingBlock = $buildingBlock; 
} 

BuildingBlock

<one-to-many field="compositionRules" target-entity="CompositionRule" mapped-by="buildingBlock"> 
    <cascade> 
     <cascade-all /> 
    </cascade> 
</one-to-many> 

public function addCompositionRule($rule) { 
    $this->compositionRules->add($rule); 
} 
+0

ここで同じ問題があります。あなたは解決策を見つけましたか? – Bono

+0

同じです。 +1。私の一時的な回避策は、$ em-> getUnitOfWork() - > getScheduledEntityInsertions()を繰り返し、特定のエンティティを削除することです。 – tiriana

答えて

10

私はそれが古い質問だとuderstoodが、私は持っていました最近同じ問題が発生している可能性があります。

エンティティの「切り離された」ステータスが原因で発生します。 doctrine :: merge()関数を使用してこれを修正する必要があります。

$rule = new CompositionRule; 
$block = $entityManager->merge($block); //it's important to use result of function, not the same element 
$entityManager->persist($role); 
$entityManager->flush(); 
+2

3年前に本当にこの質問をしました。一方、私はDoctrineに取り組んでいません。私は一般的にORMフレームワークについてもう少し分かりますが、これは良い答えのように見えます。私はその質問につきまとう他の人々のためにそれを受け入れています。あなたはそれが解決されてうれしい! – geoffreydv

関連する問題