Doctrine2 странное постоянное исключение - PullRequest
1 голос
/ 21 января 2012

У меня странные проблемы при попытке сохранить класс User, который имеет ссылку на многие UserProperties.Обратите внимание, что UserProperty будет управляться каскадом: persist.

У самого UserProperties есть ссылка на свойство.

При создании нового пользователя с новым UserProperty (который сам имеет ссылку на существующее свойство), которое выдает странную (странную, как я этого не ожидал) ошибку: InvalidArgumentException: новый объект был найден через отношение «UserProperty # property», которое не было настроено для каскадпостоянные операции для сущности

Пользователь:

class User extends IdentifiableObject {
// … other vars

/**
 * @OneToMany(targetEntity="UserProperty", mappedBy="user", cascade={"persist", "remove"}, orphanRemoval=true)
 */
private $userProperties = null;

public function __construct() {
    $this->userProperties = new ArrayCollection();
}

// … other methods
public function getUserProperties() {
    return $this->userProperties;
}

public function setUserProperties($userProperties)  {
    $this->userProperties = $userProperties;
}

public function addUserProperty(UserProperty $userProperty) {
    $userProperty->setUser($this);
    $this->userProperties[] = $userProperty;
}
}

UserProperty:

class UserProperty extends IdentifiableObject {
/**
 * @OneToOne(targetEntity="Property")
 * @JoinColumn(name="propertyID")
 */
private $property;

public function getProperty() {
    return $this->property;
}

public function setProperty($property) {
    $this->property = $property;
}
}

Класс свойства не имеет ссылок ни на один из классов.

И, наконец, мой testClass с использованием PHPUnit:

class UserDaoTest extends PHPUnit_Framework_TestCase {
private static $userDao;
private static $propertyDao;

public static function setUpBeforeClass() {
    //this will make the EntityManager called inside our DAOImpl point to our test database...
    define('__DBNAME__', 'db_test');
    createCleanTestDatabase();
    self::$userDao = new UserDaoImpl();
    self::$propertyDao = new PropertyDaoImpl();
}

public function testEntityClassVariable() {
    $this->assertEquals("User", self::$userDao->getEntityClass());
}

public function testPersistUserWithoutProperties() {
    $user = new User();
    $user->setUserName("tester1");
    $user->setUserType(1);

    self::$userDao->persist($user);
    self::$userDao->flush();

    $this->assertEquals(1, count(self::$userDao->findAll()));
}

public function testPersistUserWithProperties() {
    $user = new User();
    $user->setUserName("tester2");
    $user->setUserType(1);

    $property = new Property();
    $property->setName("propertyName");
    $property->setType(1);

    self::$propertyDao->persist($property);
    self::$propertyDao->flush();


    $userProperty = new UserProperty();
    $userProperty->setProperty($property);
    $userProperty->setValue("test");

    $user->addUserProperty($userProperty);

    self::$userDao->persist($user);
    self::$userDao->flush();

    $this->assertEquals(2, count(self::$userDao->findAll()));

    $userInDB = self::$userDao->find($user);

    $this->assertNotNull($userInDB);

    $this->assertEquals(1, count($userInDB->getUserProperties()));
}
}

Странно то, что свойство действительно создается в базе данных.Также тест работает отлично, если я использую userDao-> persist для сохранения свойства (вместо propertyDao ...

Любая помощь будет признательна, спасибо заранее!

1 Ответ

0 голосов
/ 22 августа 2012

Проблема заключалась в том, что я использовал разные entityManager в каждом дао, поэтому эффективно имел разные UnitOfWork для каждого DAO. Когда я сделал сущность синглтоном, чтобы каждый DAO имел к нему одинаковую ссылку.

...