Kliver Max
Kliver Max

Reputation: 5299

Not null violation with Doctrine 2

I want to insert data into db using Doctrine2.
I have two tables:

users
 -name
 -password
 -enabled

groupmembers
 -groupname
 -username

I want to create a new user so i want put data in both tables.
My classes:

class Users
{
/**
 * @var string
 * @Id @Column(name="name", type="string", length=128, nullable=false)
 * @ORM\GeneratedValue(strategy="SEQUENCE")
 * @ORM\SequenceGenerator(sequenceName="users_name_seq", allocationSize=1, initialValue=1)
 */
private $name;

/**
 * @var string
 * @Column(name="password", type="string", length=254, nullable=true)
 */
private $password;

/**
 * @var string
 * @Column(name="enabled", type="string", nullable=false)
 */
private $enabled;

/**
* @OneToOne(targetEntity="GroupMembers", inversedBy="username")
* @JoinColumn(name="name", referencedColumnName="username")
**/
private $group;
}

.

class GroupMembers
{
/**
 * @Id @Column(type="string")
 */
protected $groupname;

/**
 *@Id @Column(type="string")
 */
protected $username;

/**
 * @OneToOne(targetEntity="Users", mappedBy="group")
 * @JoinColumn(name="username", referencedColumnName="name")
*/
protected $user;
}

And my code :

<?php
// addUser.php
require_once "bootstrap.php";

$name = $argv[1];
$pass = "plain:".$argv[2];
$enabled = $argv[3];
$groupname = $argv[4];

$user = new Users();
$user->setName($name);
$user->setPassword($pass);
$user->setEnabled($enabled);

$group = new GroupMembers();
$group->setGroupName($groupname);
$group->setUserName($name);

$entityManager->persist($user);
$entityManager->flush();

$entityManager->persist($group);
$entityManager->flush();

echo "Your new User: ".$user->getName()."\n";

And i have an error Not null violation on field name. As you see classes have OneToOne association by this field.
What can be wrong?

UPDATE

i add ,cascade="persist" to OneToOne annotation and change code:

<?php
// addUser.php
require_once "bootstrap.php";

$name = $argv[1];
$pass = "plain:".$argv[2];
$enabled = $argv[3];
$groupname = $argv[4];

$user = new Users();
$user->setName($name);
$user->setPassword($pass);
$user->setEnabled($enabled);

$group = new GroupMembers();
$group->setGroupName($groupname);
$group->setUserName($name);
$user->setGroup($group);


 $entityManager->persist($user);
 $entityManager->flush();

 echo "Your new User: ".$user->getName()."\n";

But not help.

Upvotes: 1

Views: 862

Answers (1)

jpossi
jpossi

Reputation: 364

In Users:

/**
 * @var string
 * @Id @Column(name="name", type="string", length=128, nullable=false)
 * @ORM\GeneratedValue(strategy="SEQUENCE")
 * @ORM\SequenceGenerator(sequenceName="users_name_seq", allocationSize=1, initialValue=1)
 */
private $name;

should be

/**
 * @var string
 * @Id
 * @Column(name="name", type="string", length=128, nullable=false)
 */
private $name;

Explanation: Your Column-Description is ignored, because it isn't a valid annotation (not on beginning of line). Also the sequence doesn't make sense for your string-username.

Upvotes: 1

Related Questions