首页 > 解决方案 > 如何在 XML 文件格式学说 ORM 中添加级联参数

问题描述

据我了解,我需要在映射中添加一个“级联”参数。但我的映射是 XML 格式的。我找到了很多关于它的信息,但没有结果。请帮忙!

Мy 错误是:通过给定的关联图找到了多个非持久化新实体:\n\n * 通过关系“域\维护\维护#affectedRegions”找到了一个新实体,该关系未配置为对实体进行级联持久化操作: 域\AffectedRegion\AffectedRegion@0000000075384ba200000000535ab7f1。要解决这个问题:要么在这个未知实体上显式调用 EntityManager#persist(),要么配置级联在映射中保持此关联,例如 @ManyToOne(..,cascade={"persist"})。如果您无法找出导致问题的实体,请执行 'Domain\AffectedRegion\AffectedRegion#__toString()' 以获得线索。\n *

XML 失败:

<entity name="Domain\Maintenance\Maintenance" table="maintenances" repository-class="Infrastructure\Repositories\MaintenanceRepository">
    <id name="id" type="integer" column="id">
        <generator strategy="AUTO"/>
    </id>
    <field name="name" type="string"/>


    <one-to-many field="affectedRegions" target-entity="Domain\AffectedRegion\AffectedRegion" mapped-by="Domain\Maintenance\Maintenance" />
   <cascade>
            <cascade-merge/>
        </cascade>


</entity>

<entity name="Domain\AffectedRegion\AffectedRegion" table="affected_regions" repository-class="Infrastructure\Repositories\AffectedRegionRepository">
    <id name="id" type="integer" column="id">
        <generator strategy="AUTO"/>
    </id>
   
    <many-to-one field="region" target-entity="Domain\Region\Region" inversed-by="Domain\AffectedRegion\AffectedRegion">
        <join-column name="region_id" referenced-column-name="id" />
        <cascade>
            <cascade-persist/>
        </cascade>
    </many-to-one>
    
     <many-to-one field="maintenance" target-entity="Domain\Maintenance\Maintenance" inversed-by="Domain\AffectedRegion\AffectedRegion">
        <join-column name="maintenance_id" referenced-column-name="id" />
       <cascade>
            <cascade-persist/>
        </cascade>
    </many-to-one>
    

    <field name="vlans" type="string"/>
    <field name="olts" type="string"/>
   

</entity>

<entity name="Domain\Region\Region" table="regions" repository-class="Infrastructure\Repositories\RegionRepository">
    <id name="id" type="integer" column="id">
        <generator strategy="AUTO"/>
    </id>
    <field name="name" type="string"/>
    <field name="code" type="string"/>
    <one-to-many field="affectedRegions" target-entity="Domain\AffectedRegion\AffectedRegion" mapped-by="Domain\Maintenance\Maintenance" />
</entity>

这是我的 FK:

    $affectedRegionTable->addForeignKeyConstraint(
        $regionTable,
        ['region_id'],
        ['id'],
        ['onUpdate' => 'CASCADE'],
        'fk_affectedRegions_region_id'
    );

    $affectedRegionTable->addForeignKeyConstraint(
        $regionTable,
        ['maintenance_id'],
        ['id'],
        ['onUpdate' => 'CASCADE'],
        'fk_affectedRegions_maintenance_id'
    );

我想建立的关系是:

维护 ← 一对多 → AffectedRegions ← 多对一 → 区域

标签: symfonydoctrine-ormdoctrinecascadepersist

解决方案


这是答案。添加级联参数的另一种方法:

 <one-to-many field="affectedRegions" target-entity="Domain\AffectedRegion\AffectedRegion" mapped-by="maintenance">
        <cascade>
            <cascade-persist/>
            <cascade-remove/>
        </cascade>
    </one-to-many>

推荐阅读