根據教義2.0文檔()一個爲什麼Doctrine堅持持續引用被管理實體?
..preexisting管理實體,通過persist操作忽略。但是,persist操作級聯由X引用的實體,如果從X到這些其他實體的關係與級聯映射=持續或級聯= ALL(請參閱「傳遞持久性」)。」
我的理解是該級聯到引用管理實體應導致引用的實體被持久化操作被忽略(案例3):
持久性可達性:級聯堅持
- 標記爲cascade的集合中的新實體將持續存在,直接由Doctrine持續存在。
- 未標記爲cascade persist的集合中的新實體將生成一個Exception並回滾flush()操作。
- 跳過沒有新實體的集合。
然而這不是發生了什麼。我有一個託管Channel
實體與1:n Properties
和Data
實體。當創建了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();
}
...
}
與尋找問題答案的任何運氣?我有同樣的問題:當我只需要堅持'UserPreferences'實體與'User'實體具有_ManyToOne_關係時,執行'$ em-> persist($ user_preferences)時;'它也堅持'User'實體我不想,這是浪費'UPDATE' sql操作)...... :( –