2012-01-20 9 views
1

多くのUserPropertiesへの参照を持つUserクラスを永続化しようとすると、私は奇妙な問題を抱えています。 UserPropertyはカスケードによって管理されることに注意してください。Doctrine2 strange persist例外

UserProperties自体にはプロパティへの参照があります。

(自身がプロパティを既存のへの参照を持っている)新しいUserPropertyで新しいユーザーを作成する場合は(私はそれを期待していなかったのように奇妙な)それは奇妙なスローエラー: InvalidArgumentException:新しいエンティティました

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:

カスケードに構成されていなかった関係 '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; 
} 
} 

プロパティクラスには、いずれのクラスも参照されていません。 PHPUnitのを使用して

そして最後に、私のTestClassを:

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-を使用している場合 はまた、テストは完全に正常に動作します>すべてのヘルプは、事前に感謝をいただければ幸いです...ではなくpropertyDaoの(プロパティを保存するために

を持続!

答えて

0

の問題は、私ということでした各DAOで異なるentityManagerを使用していたので、効率的にのUnitOfWorkをDAOごとに作成していましたが、各DAOが同じ参照を持つようにエンティティを作成したとき