首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

奏鸣曲3:删除OneToMany关系中的实体不适用于'by_reference‘=> false

奏鸣曲3中的问题涉及到删除OneToMany关系中的实体时,'by_reference' => false的使用问题。

首先,'by_reference'是Symfony框架中用于处理表单字段与实体关联关系的选项之一。当设置为false时,表单字段将不会直接修改实体的关联关系,而是通过调用实体的add和remove方法来进行关联关系的管理。

在OneToMany关系中,一个实体(一)可以拥有多个关联实体(多)。当删除OneToMany关系中的实体时,如果使用'by_reference' => false,需要手动调用拥有关联关系的实体的remove方法来解除关联关系。

以下是一个示例代码:

代码语言:txt
复制
// 实体类
class EntityA
{
    /**
     * @ORM\OneToMany(targetEntity="EntityB", mappedBy="entityA", cascade={"persist"})
     */
    private $entityBs;

    public function __construct()
    {
        $this->entityBs = new ArrayCollection();
    }

    public function addEntityB(EntityB $entityB)
    {
        $this->entityBs[] = $entityB;
        $entityB->setEntityA($this);
    }

    public function removeEntityB(EntityB $entityB)
    {
        $this->entityBs->removeElement($entityB);
        $entityB->setEntityA(null);
    }
}

class EntityB
{
    /**
     * @ORM\ManyToOne(targetEntity="EntityA", inversedBy="entityBs")
     * @ORM\JoinColumn(name="entity_a_id", referencedColumnName="id")
     */
    private $entityA;

    public function getEntityA()
    {
        return $this->entityA;
    }

    public function setEntityA(EntityA $entityA)
    {
        $this->entityA = $entityA;
    }
}

// 表单类
class EntityType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('entityBs', CollectionType::class, [
                'entry_type' => EntityBType::class,
                'allow_add' => true,
                'allow_delete' => true,
                'by_reference' => false,
            ]);
    }
}

// 控制器中的删除操作
public function deleteEntityBAction(EntityA $entityA, EntityB $entityB)
{
    $entityA->removeEntityB($entityB);
    $entityManager->remove($entityB);
    $entityManager->flush();

    // 其他操作...
}

在上述示例中,'by_reference'选项设置为false,当删除EntityB实体时,会先调用EntityA的removeEntityB方法解除关联关系,然后再删除EntityB实体。

关于Symfony框架和表单组件的更多信息,可以参考腾讯云的Symfony产品文档:Symfony产品介绍

请注意,以上答案仅供参考,具体实现方式可能因具体业务需求和框架版本而有所不同。建议在实际开发中参考官方文档和相关资源进行具体实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JPA 注解学习

映射实体Bean关联关系 一对一 使用 @OneToOne 注解可以建立实体Bean之间一对一关系。一对一关系3种情况。 • 关联实体都共享同样主键。...上例为 passport_id, 因为Customer 关联属性为 passport, Passport 主键为 id. • 通过关联表来保存两个实体之间关联关系。...双向 规范多对一端几乎总是双向关联主体(owner)端,而一对多关联注解为 @OneToMany(mappedBy=) @Entity public class Troop { @OneToMany...fetch = FetchType.LAZY) // 关系维护端删除时,如果中间表存在些纪录关联信息,则会删除该关联信息; // 关系被维护端删除时,如果中间表存在些纪录关联信息...默认值: 关联表名:主表表名 + 下划线 + 从表表名;关联表到主表外键:主表表名 + 下划线 + 主表主键列名;关联表到从表外键名:主表中用于关联属性名+ 下划线 + 从表主键列名。

2.9K10

「拥抱开源」从表设计到 JPA 实现

B 每个实体至多与 A 一个实体关系。 满足以上两点,即 A 与 B 关系是一对一。 一对多 1:N A 每个实体至少与 B N(N>0)个实体关系。...B 每个实体至多与 A 一个实体关系。 满足以上两点,即 A 与 B 关系是一对多,B 与 A 关系是多对一。 多对多 M:N A 每个实体至少与 B M(M>0)个实体关系。...B 每个实体至少与 A N(N>0)个实体关系。 满足以上两点,即 A 与 B 关系是多对多。...mappedBy,拥有关系字段。仅在关联反侧(非所有权)指定此元素。 orphanRemoval,是否将删除操作应用于已从关系删除实体,以及是否将删除操作级联到那些实体。...与订单明细数据关系是一对多。即@OneToMany,注意这里需要级联保存、修改、删除、刷新所有的操作。 商品明细数据,也包含两种关联关系。 与商品数据之间关系是多对一。

1.6K20
  • 快速学习-JPA一对多

    3章 JPA一对多 3.1 示例分析 我们采用示例为客户和联系人。 客户:指的是一家公司,我们记为A。 联系人:指的是A公司员工。 在不考虑兼职情况下,公司和员工关系即为一对多。...3.3 实体关系建立以及映射配置 在实体,由于客户是少一方,它应该包含多个联系人,所以实体类要体现出客户中有多个联系人信息,代码如下: /** * 客户实体类 * 明确使用注解都是JPA...@OneToMany: 作用:建立一对多关系映射 属性: targetEntityClass:指定多多方字节码 mappedBy:指定从表实体引用主表对象名称...如果设置为false,则必须始终存在非空关系。 @JoinColumn 作用:用于定义主键字段和外键字段对应关系。...3、如果还想删除,使用级联删除引用 没有从表数据引用:随便删 在实际开发,级联删除请慎用!

    1.9K20

    JPA实体注解

    ============================================= 以上是针对实体注解,接下来时针对实体实体之间关联注解: 一对多 一般是在多一般维护关系,也就是多一方作为关系维护端...*,optional=true|false) @JoinColum(name="")--》维护关系(外键) 一般定义级联保存、级联查询 默认为立即加载! optional可选?...@OneToMany 描述一个一对多关联,该属性应该为集体类型,在数据库并没有实际字段。 ...fetch:表示抓取策略,默认为FetchType.LAZY,因为关联多个对象通常不必从数据库预先读取到内存  可选  cascade:表示级联操作策略,对于OneToMany类型关联非常重要,通常该实体更新或删除时...,其关联实体也应当被更新或删除  例如:实体User和Order是OneToMany关系,则实体User被删除时,其关联实体Order也应该被全部删除 @ManyToMany 描述一个多对多关联

    3.9K70

    Hibernate学习笔记 多表映射

    前面说了Hibernate单表映射,由于是实体类和数据表之间一对一映射,所以比较简单。现在就来说说多表映射,这需要涉及到多个实体类和数据表之间关系。因此稍微复杂一点。...我们在文章实体添加如下一段,对应Getter省略了: @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) private...单向一对多映射并不高效,如果删除了某文章某评论,Hibernate进行操作是这样:首先删除关联表该文章关联所有评论,然后再将其他评论添加回关联表,最后,根据orphanRemoval决定是否删除评论表孤立评论...双向OneToMany 理解了单向OneToMany之后,很容易就能理解双向OneToMany了。两个实体类一边需要使用ManyToOne注解,另外一边集合类使用OneToMany注解。...这时候就需要一个头像表,这个表每个头像和用户表每个用户就是一一对应关系。 一对一关系也存在单向和双向。首先我们看看单向映射。

    1.6K10

    Hibernate @OneToMany 及 @Cascade级联操作

    image.png 由图中可以看出实体关系:一对多(@OneToMany) 在实际开发场景删除员工老板不会被删除,老板被删除了员工肯定要删除 由此,就会使用级联操作,在一对多关系,@Cascade...OneToMany(一对多)单向:会产生中间表,此时可以用@onetoMany @Joincolumn(name=" ")避免产生中间表,并且指定了外键名字(别看@joincolumn在一写着,但它存在在多那个表...image.png ★员工已经级联保存,但是员工表boss_id却是空,可见级联是直接将set对象持久化到数据库,而并没有对关系进行维护(需要手动去维护)。...insert into staff (boss_id, name) values (1, '员工二') ” 直接在数据库执行SQL关系是维护好 REMOVE:级联删除 @OneToMany(mappedBy...,同时员工表记录也被级联删除

    5.9K21

    Spring 全家桶之 Spring Data JPA(四)

    ,一对多关系 * 使用注解形式配置多表关系 * 1.声明关系:@OneToMany配置一对多关系,targetEntity对方对象字节码对象 * 2.配置外键(中间表):...set customer,在customerset linkman @Test @Transactional @Rollback(false) //不自动回滚 public void testSave3...testSave1()通过在linkManset customer也可以建立两者之间外键关系,后台执行了3条SQL语句,testSave2()通过在customerset linkMan,同时在linkMan...set customer也可以建立两者之间关系,后台执行了4条SQL语句,因此可以看出在一对多关系中一一边建立外键维护关系可以执行较少SQL语句而完成外键关系建立,而多一方无需拥有外键关系维护...Customer实体类修改,mappedBy是对方配置关系属性名称 @OneToMany(mappedBy = "customer") private Set linkManSet

    1.6K20

    Spring·JPA

    (extends)外,不同实体间也存在各种模型关系,JPA 为建模涉及到实体/表提供了多种关系: OneToOne:在这种关系每个实体只含有一个明确对其它实体引用;反之亦然。...OneToMany/ManyToOne:在这种关系,一个实体可以有多个子实体,每个子实体只属于一个父实体。 ManyToMany:在这种关系,一种类型多个实体,可以含有其它类型实体多个引用。...Embedded:在这种关系,其它实体是和其父实体存储在同一个表(即,每一个表都有两个实体)。...ElementCollection:这种关系类似于 OneToMany 关系,但不同是,它引用实体是 Embedded 实体。...由于 Peroid 是一个 @Embeddable 实体,这里不能直接使用普通 @OneToMany 关系

    3.3K30

    如何在 Spring Boot 读写数据

    元数据用于描述对象和表之间映射关系,框架会据此将实体对象持久化到数据库表。 JPA API:用来操作实体对象,执行CRUD操作。对于简单 CRUD 操作,开发人员可以不用写代码。...(3)@Id 类变量注解,用于指定主键。 (4)@GeneratedValue 类变量注解,用于指定主键生成策略。 它包含strategy属性,具体说明如下: ?...CascadeType.MERGE | 级联合并;修改了子实体,保存父实体时也会同时保存子实体(常用)。 CascadeType.REMOVE | 级联删除删除实体时,会级联删除关联实体。...@OneToMany 2. @JoinColumn(name = "department_id") 3....(3)@ManyToOne(多对一) 如果我们站在用户角度来看待用户与部门之间关系时,它们之间就变成了多对一关系(多个用户隶属于一个部门),在用户实体类 User 上添加如下注解: @ManyToOne

    15.9K10

    Spring学习笔记(十七)——SpringDataJpa动态查询和复杂多表操作

    包含关系:可以通过实体包含关系描述表关系 继承关系 分析步骤 1.明确表关系 2.确定表关系(描述 外键|中间表) 3.编写实体类,再实体描述表关系...如果设置为false,则必须始终存在非空关系。 @JoinColumn 作用:用于定义主键字段和外键字段对应关系。...从表:联系人表 * 再从表上添加外键 3.编写实体类,再实体描述表关系(包含关系) 客户:再客户实体包含一个联系人集合...分析步骤 1.明确表关系 多对多关系 2.确定表关系(描述 外键|中间表) 中间间表 3.编写实体类,再实体描述表关系...} /*级联删除删除id为2用户同时删除关联对象*/ @Test @Transactional //开启事务 @Rollback(false)//设置为不回滚

    3.5K10

    Django学习笔记之Queryset详解

    先filter,然后对得到QuerySet执行delete()方法就行了,它会同时删除关联它那些记录,比如我删除记录表1A记录,表2B记录中有A外键,那同时也会删除B记录,那ManyToMany...对于ManyToMany,删除其中一方记录时,会同时删除中间表记录,即删除双方关联关系。...与下面一句等价,既可以用实体,也可以用 #实体主键,其实即使用实体,也是只用实体主键而已。这两种方式对OneToOne、 #OneToMany、ManyToMany正向、反向连接都适用。...select_related()不能用于OneToMany反向连接,和ManyToMany,这些都是model一条记录对应关联表多条记录。...用于OneToMany反向连接,及ManyToMany。

    2.7K30

    hibernate关联与级联

    2、关联分类:关联可以分为一对一、一对多/多对一、多对多关联 关联是有方向 关联关键点都在外键上 如何建立一对多双向关联 以订单和订单项做案例 一个订单对多个订单项,多个订单项对一个订单 在订单实体需要添加两个属性...: Set orderItems initOrderItems = 0;//0代表懒加载 1代表立即加载 在订单项实体需要添加一个属性:Order order 定义一对多关系时需要采用接口方式...1、在Order.hbm.xml需要添加(建立订单对订单项一对多关系) <!...(建立订单项对订单多对一关系) <property name="oid" type="java.lang.Integer" column="oid" insert="<em>false</em>" update="<em>false</em>...,user会被<em>删除</em>,user_role<em>的</em><em>中</em><em>的</em><em>关系</em>也会被<em>删除</em>了,但对应<em>的</em>role不会被<em>删除</em> @Test public void testDelete() { User user = userDao.findById

    1.3K10

    一个DDD指导下实体类设计案例

    在我们公司开发习惯,数据库实体类通常会继承一个叫做BaseDomain类,这个类很简单,主要用来填充一些数据库实体公用属性,它设计如下: @MappedSuperclass public...,尽管开发因此遇到一些不适,但也是尽可能克服。...等等,上面说到添加这个基类后,对开发造成了不适感,这引起了我思考,下面就来谈谈直观有哪些不适感以及解决方案。...反映到实体设计,便是这样: public class Member extends BaseDomain{ private String username; @OneToMany private...这,要真是这样源头都弄错了,压根没法聊了对吧 3 总结 BaseDomain这样设计本身并不是我想要强调重点,但是既然出现了BaseDomain这样设计,那么它究竟应该被什么样实体继承,就是需要被考虑

    1.5K70

    《Java从入门到放弃》框架入门篇:使用注解方式配置hibernate映射关系

    所以,这一篇,我们来说说使用注解方式来在接在实体类上配置映射关系。...第一步:新建一个项目,或者把之前项目中实体类、映射文件,还有hibernatemapping标签都删除,然后在DBBrowser再次生成实体类。如下图: ?...红框选项就表示直接在POJO上以注解方式加上映射关系。注意括号内hibernate版本,必须是3.2及以上才行。 生成后实体类(Author和Blog)代码我就不复制上来了,内容太多。...", unique = true, nullable = false) @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy...REMOVE:删除时级联。 ALL:    所有操作都级联(默认)。 如果你设置为ALL以外值,你会发现,完全没有级联!!!

    74270

    PlayFramework 2.x 技巧-@ManyToMany关联

    简介     实体之间关联关系是刚入门同学比较头疼问题,但是在日常开发又是比较重要技巧,熟练使用实体关联,能够使代码清晰易懂,并且节省宝贵开发时间。...,因为Role是关系查询端,而不是维护端 3)mappedBy属性使用     mappedBy属性用于明确指定该实体关系查询端,而另一个实体关系维护端。...在ManyToMany关联,级联删除只会删除关联关系,而不会删除关联实体。...小结 1)在双向关联关系,明确使用mappedBy属性指定关系查询端(反向端),另一端为关系维护端; 2)关系查询端(反向端)只能查询关系,而不能保存关系3)ManyToMany...关系级联删除,只会删除关联关系,而不会删除关联实体

    1.2K100
    领券