Czołem!

Napotałem na problem z zapisaniem entity Doctrine2 w relacji OneToOne.

Opis problemu:

Posiadam dwie encje: UserEntity (użytkownik) oraz UserDataEntity (dane o użytkowniku). Każdy UserEntity może posiadać UserDataEntity (ale nie jest to wymagane gdy nie podano danych), ale każdy UserDataEntity musi mieć UserEntity, którego dotyczy.

Kiedy próbuję zapisać UserEntity, otrzymuję komunikat z PostgreSQL:

> SQLSTATE[23502]: Not null violation: 7 BŁĄD: pusta wartość w kolumnie "id" narusza ograniczenie wymaganej wartości

Poniżej moje encje:

  1. <?php
  2. /**
  3.   * A user.
  4.   *
  5.   * @ORM\Entity
  6.   * @ORM\Table(name="users")
  7.   */
  8. class UserEntity extends AbstractEntity
  9. {
  10. /**
  11.   * @ORM\Id
  12.   * @ORM\Column(type="integer");
  13.   * @ORM\GeneratedValue(strategy="AUTO")
  14.   */
  15. protected $id;
  16.  
  17. /**
  18.   * @ORM\Column(type="string")
  19.   */
  20. protected $name;
  21.  
  22. /**
  23.   * @ORM\OneToOne(targetEntity="ModuleAdmin\Entity\TradesmanDataEntity", inversedBy="parent", cascade={"persist"})
  24.   * @ORM\JoinColumn(name="id", referencedColumnName="data_id")
  25.   */
  26. protected $data;
  27.  
  28. public function setData(UserDataEntity $data)
  29. {
  30. $this->data = $data;
  31. }
  32. }

I dane użytkownika:

  1. <?php
  2. /**
  3.   * A user's data.
  4.   *
  5.   * @ORM\Entity
  6.   * @ORM\Table(name="users_data")
  7.   */
  8. class UserDataEntity extends AbstractEntity
  9. {
  10. /**
  11.   * @ORM\Id
  12.   * @ORM\OneToOne(targetEntity="ModuleAdmin\Entity\TradesmanEntity", mappedBy="parent", cascade={"persist"})
  13.   * @ORM\JoinColumn(name="data_id", referencedColumnName="id")
  14.   */
  15. protected $parent;
  16.  
  17. /**
  18.   * @ORM\Column(type="string")
  19.   */
  20. protected $email;
  21.  
  22. /**
  23.   * @ORM\Column(type="string")
  24.   */
  25. protected $phone;
  26.  
  27. /**
  28.   * Provides creation for new empty entity.
  29.   *
  30.   */
  31. public function __construct(TradesmanEntity $parent)
  32. {
  33. $this->parent = $parent;
  34. }
  35. }


Moja schema wygląda tak:

  1. CREATE TABLE users
  2. (
  3. id serial NOT NULL,
  4. name character varying(255) NOT NULL,
  5. CONSTRAINT users_pkey PRIMARY KEY (id )
  6. );
  7.  
  8.  
  9. CREATE TABLE users_data
  10. (
  11. data_id integer NOT NULL,
  12. email character varying(255) NOT NULL,
  13. phone character varying NOT NULL,
  14. CONSTRAINT users_data_pkey PRIMARY KEY (data_id ),
  15. CONSTRAINT users_data_data_id_fkey FOREIGN KEY (data_id)
  16. REFERENCES users (id) MATCH SIMPLE
  17. ON UPDATE RESTRICT ON DELETE CASCADE
  18. );


Chciałbym zachować integralność bazy danych i ogarnienia na poziomie bazy danych, nie ORM'a.