text: Q:
  
  Doctrine\ORM\Mapping\MappingException Duplicate definition of column 'username' on entity
  
  I am using FOSUserBundle but I wanted to rename the roles field column name to user_roles for legacy database,
  By referring to 
  https://github.com/FriendsOfSymfony/FOSUserBundle/issues/338
  and 
  https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/doctrine.md#replacing-the-mapping-of-the-bundle
  I am trying to overwrite the existing FOS\UserBundle\Model\User  with my AcmeDemoBundle:User entity by mapping all fields again. 
  This is my Class,
  PLEASE NOTE I AM EXTENDING ENTITY DIRECTLY FROM "FOS\UserBundle\Model\User"
  namespace Acme\SecurityBundle\Entity;
  
  use FOS\UserBundle\Model\User as BaseUser;
  use Acme\CommonBundle\Util\Url as Url;
  use Doctrine\ORM\Mapping as ORM;
  use Doctrine\Common\Collections\Collection;
  use Doctrine\Common\Collections\ArrayCollection;
  
  /**
   * @ORM\Entity
   * @ORM\Table(name="users")
   * @ORM\Entity(repositoryClass="Acme\SecurityBundle\Entity\UserRepository") 
   */
  Class User extends BaseUser
  {
  
      /**
       * @ORM\Id
       * @ORM\Column(type="integer")
       * @ORM\GeneratedValue(strategy="AUTO")
       */
      protected $id;
  
      /**
       * @var string
       * @ORM\Column(name="username", type="string", length=255)     
       */
      protected $username;
  
      /**
       * @var string
       * @ORM\Column(name="username_canonical", type="string", length=255, unique=true)     
       */
      protected $usernameCanonical;
  
      /**
       * @var string
       * @ORM\Column(name="email", type="string", length=255)       
       */
      protected $email;
  
      /**
       * @var string
       * @ORM\Column(name="email_canonical", type="string", length=255, unique=true)       
       */
      protected $emailCanonical;
  
      /**
       * @var boolean
       * @ORM\Column(name="enabled", type="boolean")         
       */
      protected $enabled;
  
      /**
       * The salt to use for hashing
       *
       * @var string
       * @ORM\Column(name="salt", type="string")     
       */
      protected $salt;
  
      /**
       * Encrypted password. Must be persisted.
       *
       * @var string
       * @ORM\Column(name="password", type="string")     
       */
      protected $password;
  
      /**
       * Plain password. Used for model validation. Must not be persisted.
       *
       * @var string     
       */
      protected $plainPassword;
  
      /**
       * @var \DateTime
       * @ORM\Column(name="last_login", type="datetime", nullable=true)       
       */
      protected $lastLogin;
  
      /**
       * Random string sent to the user email address in order to verify it
       *
       * @var string
       * @ORM\Column(name="confirmation_token", type="string", nullable=true)     
       */
      protected $confirmationToken;
  
      /**
       * @var \DateTime
       * @ORM\Column(name="password_requested_at", type="datetime", nullable=true)         
       */
      protected $passwordRequestedAt;
  
      /**
       * @var Collection
       */
      protected $groups;
  
      /**
       * @var boolean
       * @ORM\Column(name="locked", type="boolean")       
       */
      protected $locked;
  
      /**
       * @var boolean
       * @ORM\Column(name="expired", type="boolean")         
       */
      protected $expired;
  
      /**
       * @var \DateTime
       * @ORM\Column(name="expires_at", type="datetime", nullable=true)      
       */
      protected $expiresAt;
  
      /**
       * @var array
       * @ORM\Column(name="fos_roles", type="array", nullable=true)
       */
      protected $roles;
  
      /**
       * @var boolean
       * @ORM\Column(name="credentials_expired", type="boolean")     
       */
      protected $credentialsExpired;
  
      /**
       * @var \DateTime
       * @ORM\Column(name="credentials_expire_at", type="datetime", nullable=true)     
       */
      protected $credentialsExpireAt;
  
      public function __construct()
      {
          parent::__construct();
          $this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36);
          $this->enabled = false;
          $this->locked = false;
          $this->expired = false;
          $this->roles = array();
          $this->credentialsExpired = false;
          //$this->setEmailHash();
      }
      public function addRole($role)
      {
          $role = strtoupper($role);
          if ($role === static::ROLE_DEFAULT) {
              return $this;
          }
  
          if (!in_array($role, $this->roles, true)) {
              $this->roles[] = $role;
          }
  
          return $this;
      }
  
      /**
       * Serializes the user.
       *
       * The serialized data have to contain the fields used by the equals method and the username.
       *
       * @return string
       */
      public function serialize()
      {
          return serialize(array(
              $this->password,
              $this->salt,
              $this->usernameCanonical,
              $this->username,
              $this->expired,
              $this->locked,
              $this->credentialsExpired,
              $this->enabled,
              $this->id,
          ));
      }
  
      /**
       * Unserializes the user.
       *
       * @param string $serialized
       */
      public function unserialize($serialized)
      {
          $data = unserialize($serialized);
          // add a few extra elements in the array to ensure that we have enough keys when unserializing
          // older data which does not include all properties.
          $data = array_merge($data, array_fill(0, 2, null));
  
          list(
              $this->password,
              $this->salt,
              $this->usernameCanonical,
              $this->username,
              $this->expired,
              $this->locked,
              $this->credentialsExpired,
              $this->enabled,
              $this->id
              ) = $data;
      }
  
      /**
       * Removes sensitive data from the user.
       */
      public function eraseCredentials()
      {
          $this->plainPassword = null;
      }
  
      /**
       * Returns the user unique id.
       *
       * @return mixed
       */
      public function getId()
      {
          return $this->id;
      }
  
      public function getUsername()
      {
          return $this->username;
      }
  
      public function getUsernameCanonical()
      {
          return $this->usernameCanonical;
      }
  
      public function getSalt()
      {
          return $this->salt;
      }
  
      public function getEmail()
      {
          return $this->email;
      }
  
      public function getEmailCanonical()
      {
          return $this->emailCanonical;
      }
  
      /**
       * Gets the encrypted password.
       *
       * @return string
       */
      public function getPassword()
      {
          return $this->password;
      }
  
      public function getPlainPassword()
      {
          return $this->plainPassword;
      }
  
      /**
       * Gets the last login time.
       *
       * @return \DateTime
       */
      public function getLastLogin()
      {
          return $this->lastLogin;
      }
  
      public function getConfirmationToken()
      {
          return $this->confirmationToken;
      }
  
      /**
       * Returns the user roles
       *
       * @return array The roles
       */
      public function getRoles()
      {
          $roles = $this->roles;
  
          foreach ($this->getGroups() as $group) {
              $roles = array_merge($roles, $group->getRoles());
          }
  
          // we need to make sure to have at least one role
          $roles[] = static::ROLE_DEFAULT;
  
          return array_unique($roles);
      }
  
      /**
       * Never use this to check if this user has access to anything!
       *
       * Use the SecurityContext, or an implementation of AccessDecisionManager
       * instead, e.g.
       *
       *         $securityContext->isGranted('ROLE_USER');
       *
       * @param string $role
       *
       * @return boolean
       */
      public function hasRole($role)
      {
          return in_array(strtoupper($role), $this->getRoles(), true);
      }
  
      public function isAccountNonExpired()
      {
          if (true === $this->expired) {
              return false;
          }
  
          if (null !== $this->expiresAt && $this->expiresAt->getTimestamp() < time()) {
              return false;
          }
  
          return true;
      }
  
      public function isAccountNonLocked()
      {
          return !$this->locked;
      }
  
      public function isCredentialsNonExpired()
      {
          if (true === $this->credentialsExpired) {
              return false;
          }
  
          if (null !== $this->credentialsExpireAt && $this->credentialsExpireAt->getTimestamp() < time()) {
              return false;
          }
  
          return true;
      }
  
      public function isCredentialsExpired()
      {
          return !$this->isCredentialsNonExpired();
      }
  
      public function isEnabled()
      {
          return $this->enabled;
      }
  
      public function isExpired()
      {
          return !$this->isAccountNonExpired();
      }
  
      public function isLocked()
      {
          return !$this->isAccountNonLocked();
      }
  
      public function isSuperAdmin()
      {
          return $this->hasRole(static::ROLE_SUPER_ADMIN);
      }
  
      public function isUser(\FOS\UserBundle\Model\UserInterface $user = null)
      {
          return null !== $user && $this->getId() === $user->getId();
      }
  
      public function removeRole($role)
      {
          if (false !== $key = array_search(strtoupper($role), $this->roles, true)) {
              unset($this->roles[$key]);
              $this->roles = array_values($this->roles);
          }
  
          return $this;
      }
  
      public function setUsername($username)
      {
          $this->username = $username;
  
          return $this;
      }
  
      public function setUsernameCanonical($usernameCanonical)
      {
          $this->usernameCanonical = $usernameCanonical;
  
          return $this;
      }
  
      /**
       * @param \DateTime $date
       *
       * @return User
       */
      public function setCredentialsExpireAt(\DateTime $date = null)
      {
          $this->credentialsExpireAt = $date;
  
          return $this;
      }
  
      /**
       * @param boolean $boolean
       *
       * @return User
       */
      public function setCredentialsExpired($boolean)
      {
          $this->credentialsExpired = $boolean;
  
          return $this;
      }
  
      public function setEmail($email)
      {
          $this->email = $email;
  
          return $this;
      }
  
      public function setEmailCanonical($emailCanonical)
      {
          $this->emailCanonical = $emailCanonical;
  
          return $this;
      }
  
      public function setEnabled($boolean)
      {
          $this->enabled = (Boolean) $boolean;
  
          return $this;
      }
  
      /**
       * Sets this user to expired.
       *
       * @param Boolean $boolean
       *
       * @return User
       */
      public function setExpired($boolean)
      {
          $this->expired = (Boolean) $boolean;
  
          return $this;
      }
  
      /**
       * @param \DateTime $date
       *
       * @return User
       */
      public function setExpiresAt(\DateTime $date = null)
      {
          $this->expiresAt = $date;
  
          return $this;
      }
  
      public function setPassword($password)
      {
          $this->password = $password;
  
          return $this;
      }
  
      public function setSuperAdmin($boolean)
      {
          if (true === $boolean) {
              $this->addRole(static::ROLE_SUPER_ADMIN);
          } else {
              $this->removeRole(static::ROLE_SUPER_ADMIN);
          }
  
          return $this;
      }
  
      public function setPlainPassword($password)
      {
          $this->plainPassword = $password;
  
          return $this;
      }
  
      public function setLastLogin(\DateTime $time = null)
      {
          $this->lastLogin = $time;
  
          return $this;
      }
  
      public function setLocked($boolean)
      {
          $this->locked = $boolean;
  
          return $this;
      }
  
      public function setConfirmationToken($confirmationToken)
      {
          $this->confirmationToken = $confirmationToken;
  
          return $this;
      }
  
      public function setPasswordRequestedAt(\DateTime $date = null)
      {
          $this->passwordRequestedAt = $date;
  
          return $this;
      }
  
      /**
       * Gets the timestamp that the user requested a password reset.
       *
       * @return null|\DateTime
       */
      public function getPasswordRequestedAt()
      {
          return $this->passwordRequestedAt;
      }
  
      public function isPasswordRequestNonExpired($ttl)
      {
          return $this->getPasswordRequestedAt() instanceof \DateTime &&
              $this->getPasswordRequestedAt()->getTimestamp() + $ttl > time();
      }
  
      public function setRoles(array $roles)
      {
          $this->roles = array();
  
          foreach ($roles as $role) {
              $this->addRole($role);
          }
  
          return $this;
      }
  
      /**
       * Gets the groups granted to the user.
       *
       * @return Collection
       */
      public function getGroups()
      {
          return $this->groups ? : $this->groups = new ArrayCollection();
      }
  
      public function getGroupNames()
      {
          $names = array();
          foreach ($this->getGroups() as $group) {
              $names[] = $group->getName();
          }
  
          return $names;
      }
  
      public function hasGroup($name)
      {
          return in_array($name, $this->getGroupNames());
      }
  
      public function addGroup(\FOS\UserBundle\Model\GroupInterface $group)
      {
          if (!$this->getGroups()->contains($group)) {
              $this->getGroups()->add($group);
          }
  
          return $this;
      }
  
      public function removeGroup(\FOS\UserBundle\Model\GroupInterface $group)
      {
          if ($this->getGroups()->contains($group)) {
              $this->getGroups()->removeElement($group);
          }
  
          return $this;
      }
  
      public function __toString()
      {
          return (string) $this->getUsername();
      }
  
  }
  
  If I remove extends BaseUser (FOS\UserBundle\Model\User), it gives error "The user provider must return a UserInterface object."
  Then I tried adding  "implements UserInterface, GroupableInterface" but it still gives "There is no user provider for user "Acme\SecurityBundle\Entity\User". 
  
  A:
  
  https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Model/User.php
  https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/config/doctrine/model/User.orm.xml
  The property username is already defined in FOS\UserBundle\Model\User.  Its metadata is in their resources config.  So you are defining that column twice essentially.
  
  A:
  
  We dont need to overwrite all fields to rename the field in database, I could achieve this by using AttributeOverride
   /**
   * @ORM\Entity
   * @ORM\Table(name="users")
   * @ORM\Entity(repositoryClass="Acme\SecurityBundle\Entity\UserRepository")
   * @ORM\AttributeOverrides({
   *      @ORM\AttributeOverride(name="roles",
   *          column=@ORM\Column(
   *              name     = "user_roles",
   *              type = "array"
   *          )
   *      )
   * })  
   */
      Class User extends BaseUser
      {
  
      ...
  
      }
  
  