/**
  * @param string $name
  * @param mixed $value string, int, boolean, object, ...
  * @param int $owner
  * @param null|string $group
  * @return $this
  * @throws \Doctrine\ORM\OptimisticLockException
  * @throws \Doctrine\ORM\ORMInvalidArgumentException
  */
 public function set($name, $value, $owner = null, $group = null)
 {
     try {
         $item = $this->get($name, $owner, $group);
     } catch (PropertyNotExistsException $ex) {
         $item = null;
     }
     $nname = null !== $owner ? $name . '_' . $owner : $name;
     if (null !== $item || !(array_key_exists($name, $this->defaults) && $this->defaults[$name] === $item)) {
         $setting = $this->em->getRepository('SettingsBundle:Setting')->findOneBy(['name' => $nname, 'ownerId' => $owner, 'group' => $group]);
         if (null === $setting) {
             $setting = new Setting();
         }
     } else {
         $setting = new Setting();
     }
     $setting->setName($nname);
     $setting->setValue($value);
     $setting->setOwnerId($owner);
     $setting->setGroup($group);
     $this->em->persist($setting);
     $this->em->flush($setting);
     if ($this->cacheProvider) {
         $this->cacheProvider->save($nname, serialize($setting));
     }
     return $this;
 }