2016-05-19 4 views
0

をデシリアライズ。 JMSserializerで逆シリアル化し、の場合、COUNTRYエンティティという2つの異なるインスタンスが作成されます。JMSserializerは、私はこのようなJSONを持っている関連教義エンティティ

doctrineでマージを適用する場合は、countryを「何か」に適切に設定しますが、「何か2」には適切に設定しないでください。したがって、保存後の結果は次のとおりです。

"relatedCollection": [ 
    { 
    id:1, 
    name: "something", 
    country: { 
      id:1 
      } 
    }, 
    { 
    id:2, 
    name: "something 2", 
    country: null 
    } 

] 

Doctrineの場合、分離されたCountryという2つの異なるエンティティがあります。そして教義は最初のものをつけてそれを適切に保存しますが、2番目のものは保存しません。

これは、関連するエンティティIDが同じコレクションをマージするとき、ManyToOne関係でのみ発生します。 国1と国2を保存すると、繰り返し国がないので、プロパティを保存します。

答えて

1

JMSシリアライザはオブジェクトの逆シリアル化のみを行い、doctrineオブジェクトは処理しません。あなたがマージのいずれかの種類を行う必要があり

、カスケードは、マージ、例えば

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/working-with-associations.html#transitive-persistence-cascade-operations

あなたはあなたのための自動マージ自動的

+0

感謝を行うには、逆シリアル化のリスナー\サブスクライバを書くことができ、私はdidnの教義がどのようにエンティティを管理しているかについては分かりませんが、私はマージとカスケードマージの設定を解決しました。 – Serginho

+0

デシリアライズされたエンティティは、通常、ドクトリンエンティティを操作している状態です。この種のエンティティは、デシリアライズの瞬間にエンティティマネージャに接続されないため、変更は追跡されず、リレーションは解決されません。この状態でエンティティを手動で永続化すると、新しいエンティティが生成されます。 'merge()'コールは、分離されたエンティティを 'em'に接続し、通常のOOPの処理を – ScayTrase