2014-01-10 63 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