2

У меня есть объект User, который имеет многого для отношения к ролям. Я пытался реализовать оптимистичную блокировку, все работает нормально, только когда я менял роли, она не меняет версию (версия пользовательского сущности), это правильное поведение?Оптимистичный замок в Doctrine2 не работает для многих и многих отношений

class User { 
    /** 
    * User's roles. 
    * 
    * @ORM\ManyToMany(targetEntity="Role") 
    */ 
    private $roles; 
... 

ответ

1

Механизмы блокировки Doctrine 2 не учитывают ассоциации. Они защищают только от изменений самих объектов. ИМХО это ожидается, потому что у него нет способа узнать, какие ассоциации включать и какие игнорировать. Это не то, что вы хотели бы сделать слепо на всех ассоциациях.

Теоретически Doctrine 2 может достичь этого, добавив опцию в сопоставления ассоциаций, но на данный момент это просто не поддерживается.

Так у вас есть 2 варианта:

  1. попытаться реализовать такую ​​возможность, и представить PR :)
  2. реализовать свой собственный оптимистический механизм блокировки, который примет эту специфическую связь во внимание.
+0

Я беспокоился об этом случае, вы уверены в этом, верно? – Tom

+0

Да, я уверен :) Взгляните на код (особенно на прессу и гидраторы). –

0

Я не пробовал, но я думаю, что это правильный bahaviour (потому что на одном уровне не изменяют сущности пользователя), и нет никаких оснований для блокировки объекта пользователя - это не изменилось.

+0

Я думаю, что есть причина для блокировки, потому что сущность изменяется, отношение является частью сущности, не так ли? Поэтому, если вы изменили свои роли в пользователе, вы ожидаете, что также заблокирует этот объект. Потому что кто-то еще может менять роли, и это будет непоследовательно. – Tom

+0

Вы не писали о блокировке объекта «Роль», и проблема заключается в блокировке роли не пользователя (на основе вашего ответа). А как насчет ситуации, когда у двух пользователей одинаковая роль? Приложение должно изменить версию двух пользователей? Не имеет смысла. –

+0

Нет, я не сделал этого, потому что я не говорю о блокировке объекта Role, но в качестве объекта пользователя. Я не обновляю объект Role, но соединение ManyToMany на объекте пользователя. с «Потому что кто-то может изменить роли, а также будет непоследовательно» Я имею в виду изменение отношения ManyToMany в User, поэтому у пользователя есть, например, роли администратора и тестера. С изменением я имею в виду, что кто-то добавляет новую роль пользователю или удаляет старый. – Tom