2013-04-02 73 views
1

我想用两个指向同一对象的复合外键构造一个对象,但它们似乎具有相同的数据,就像只在一列上进行连接一样,product_id。学说多个复合外键

class PostpaidProduct extends Product { 
    /** 
    * @ManyToOne(targetEntity="Bundle", fetch="EAGER", cascade={"persist"}) 
    * @JoinColumn(name="bundle_voice_id", referencedColumnName="id") 
    */ 
    private $bundleVoice; 

    /** 
    * @ManyToOne(targetEntity="Bundle", fetch="EAGER", cascade={"persist"}) 
    * @JoinColumn(name="bundle_data_id", referencedColumnName="id") 
    */ 
    private $bundleData; 

    /** 
    * @OneToMany(targetEntity="BundlePromo", mappedBy="product", fetch="EAGER", cascade={"persist"}) 
    * @JoinColumns({ 
    * @JoinColumn(name="id", referencedColumnName="product_id"), 
    * @JoinColumn(name="bundle_voice_id", referencedColumnName="bundle_id") 
    * }) 
    */ 
    private $bundleVoicePromos; 

    /** 
    * @OneToMany(targetEntity="BundlePromo", mappedBy="product", fetch="EAGER", cascade={"persist"}) 
    * @JoinColumns({ 
    * @JoinColumn(name="id", referencedColumnName="product_id"), 
    * @JoinColumn(name="bundle_data_id", referencedColumnName="bundle_id") 
    * }) 
    */ 
    private $bundleDataPromos; 

}

什么是错我的映射? 是否有可能具有复合外键但不是主键?

+0

错误是什么? Btw @Id是必需的;您应该添加组合键的每个属性。 – DEY

回答

0

我曾经与Doctrine的一位开发人员谈过,他说@OneToMany关系中的@JoinColumns字段会被忽略。另一种方法是只有一个外键,并在实体方法中使用匹配标准,根据另一个键过滤所需的条目。另一个解决方案是使存储库方法专用于获取这些值。

另外,在OneToMany关系中,预先抓取不起作用,所以它会为所有孩子分开查询。因此,如果您的产品具有多个价格,那么在获取产品时,它将针对提取价格执行单独的查询。

+0

不正确。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/annotations-reference.html#manytoone在学说中有'fetch =“EAGER”'选项。并且JoinColumn永远不会被忽略*不确定你从哪里得到这个信息 – Dheeraj

+0

这是4年前 – madalex