2014-01-10 97 views
3

根據教義2.0文檔(​​)一個爲什麼Doctrine堅持持續引用被管理實體?

..preexisting管理實體,通過persist操作忽略。但是,persist操作級聯由X引用的實體,如果從X到這些其他實體的關係與級聯映射=持續或級聯= ALL(請參閱「傳遞持久性」)。」

我的理解是該級聯到引用管理實體應導致引用的實體被持久化操作被忽略(案例3):

持久性可達性:級聯堅持

  1. 標記爲cascade的集合中的新實體將持續存在,直接由Doctrine持續存在。
  2. 未標記爲cascade persist的集合中的新實體將生成一個Exception並回滾flush()操作。
  3. 跳過沒有新實體的集合。

然而這不是發生了什麼。我有一個託管Channel實體與1:n PropertiesData實體。當創建了Channel實體時,一些屬性被檢索但未被修改。

當我添加數據,並通過持續

$channel->addData(new Model\Data($channel, $timestamp, $value)); 
$em->persist(); 

的實體,我可以看到SQL編寫新Data實體,但確實也看到更新現有Properties(與舊的,不變的值)。

爲什麼Doctrine(2.4.1)堅持託管實體的關係?

實體定義看起來象下面這樣:

class Channel extends Entity { 
    /** 
    * @OneToMany(targetEntity="Data", mappedBy="channel", cascade={"persist"}, orphanRemoval=true) 
    * @OrderBy({"timestamp" = "ASC"}) 
    */ 
    protected $data = NULL; 

    /** 
    * Constructor 
    */ 
    public function __construct($type) { 
     parent::__construct($type); 
     $this->data = new ArrayCollection(); 
    } 

    /** 
    * Add a new data to the database 
    */ 
    public function addData(\Volkszaehler\Model\Data $data) { 
     $this->data->add($data); 
    } 

    ... 
} 

abstract class Entity { 

    /** 
    * @OneToMany(targetEntity="Property", mappedBy="entity", cascade={"remove", "persist"}, orphanRemoval=true) 
    * @OrderBy({"key" = "ASC"}) 
    */ 
    protected $properties = NULL; 

    /** 
    * Constructor 
    * 
    * @param string $type 
    */ 
    public function __construct($type) { 
     if (!Definition\EntityDefinition::exists($type)) { 
      throw new \Exception('Unknown entity type: \'' . $type . '\''); 
     } 

     $this->properties = new Collections\ArrayCollection(); 
    } 

    ... 
} 
+0

與尋找問題答案的任何運氣?我有同樣的問題:當我只需要堅持'UserPreferences'實體與'User'實體具有_ManyToOne_關係時,執行'$ em-> persist($ user_preferences)時;'它也堅持'User'實體我不想,這是浪費'UPDATE' sql操作)...... :( –

回答

1

我終於指出主義確實堅持堅持引用管理實體。

在上述情況下,我修改了相關實體(某些屬性的改變類型),由於其在計算改變集時的比較,Doctrine確實將其解釋爲更新。

有關於使用PostFlush事件,以防止一些這方面的討論,但SOFAR沒有定論:https://github.com/doctrine/doctrine2/pull/382#issuecomment-43421295