Doctrine 2.3中的@AssociationOverride和@AttributeOverride

5
根据标题,新注释 @AssociationOverride 和 @AttributeOverride 的目的是什么?
在Doctrine网站上,我唯一能找到的信息是:
@AssociationOverride 和 @AttributeOverride(对Trait和MappedSuperclass有用)
1个回答

5
通过查看提交代码,我们可以看到它的用途是覆盖已定义在映射超类/特质中的字段映射。
提交中包含的测试演示了这种行为:

映射超类

/** 
 * @MappedSuperclass
 */
class User
{
    /**
     * @Id
     * @GeneratedValue
     * @Column(type="integer", name="user_id", length=150)
     */
    protected $id;

    /**
     * @Column(name="user_name", nullable=true, unique=false, length=250)   
     */
    protected $name;

    /**
     * @var ArrayCollection
     *
     * @ManyToMany(targetEntity="Group", inversedBy="users", cascade={"persist", "merge", "detach"})
     * @JoinTable(name="users_groups",
     *  joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
     *  inverseJoinColumns={@JoinColumn(name="group_id", referencedColumnName="id")}
     * )
     */
    protected $groups;

    /**
     * @var Address
     *
     * @ManyToOne(targetEntity="Address", cascade={"persist", "merge"})
     * @JoinColumn(name="address_id", referencedColumnName="id")
     */ 
    protected $address;

    ...
}

使用 @AssociationOverride 进行子类化

/*  
 * @Entity
 * @AssociationOverrides({
 *      @AssociationOverride(name="groups",
 *          joinTable=@JoinTable(
 *              name="users_admingroups",
 *              joinColumns=@JoinColumn(name="adminuser_id"),
 *              inverseJoinColumns=@JoinColumn(name="admingroup_id")
 *          )
 *      ),
 *      @AssociationOverride(name="address",
 *          joinColumns=@JoinColumn(
 *              name="adminaddress_id", referencedColumnName="id"
 *          )
 *      )   
 * })
 */
class Admin extends User
{
    ...
}

使用@AttributeOverride进行子类化

/**
 * @Entity
 * @AttributeOverrides({
 *      @AttributeOverride(name="id",
 *          column=@Column(
 *              name     = "guest_id",
 *              type     = "integer",
 *              length   = 140
 *          )
 *      ),
 *      @AttributeOverride(name="name",
 *          column=@Column(
 *              name     = "guest_name",
 *              nullable = false,
 *              unique   = true,
 *              length   = 240
 *          )
 *      )   
 * })
 */
class Guest extends User
{
    ...
}

那么,我们不能使用映射超类的子类更改targetEntity吗?如果是这样,为什么我们需要这两个新注释呢? - gremo
我认为这并不是为了改变targetEntity而设计的,而且那样做也没有意义。需要更改targetEntity的需求对我来说就像是代码异味,表明需要重新思考你的架构。相反,这允许您将属性映射到与映射的超类不同的数据库字段(例如guest_id vs user_idadminaddress_id vs address_id)。 - BenMorel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接