2013-04-02 75 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