2013-05-09 3 views
0

엔티티를 삽입 할 때, article 가정 해 봅시다 :병합 된 엔티티가 삽입시 왜 업데이트됩니까?

Article::id 
Article::text 
Article::author -> User 

기사는 저자가 (ManyToOne)

User::id 
User::name 
User::created 

내가 엔티티 관리자 사용하여 데이터베이스에서 사용자를 가져 오는 경우 :

$user = $em->find(1); 

$article = new Article(); 
$article->text = "balh blah"; 
$article->user = $user; 

$em->persist($article); 
$em->flush(); 

데이터베이스에 올바른 삽입 만 있습니다. 내가 세션에 저장 (또는 캐시)하는 사용자를 사용하는 경우

INSERT INTO Article ... 

지금 :

$user = $cache->find(1); 
$user = $em->merge($user); 

$article = new Article(); 
$article->text = "balh blah"; 
$article->user = $user; 

$em->persist($article); 
$em->flush(); 

나는 MySQL의에서이 쿼리를 볼 수 있습니다

INSERT INTO Article ... 
UPDATE user set created="..." WHERE id = 1 

와 같은 사용자의 경우 더 OneToMany 관계, 그들 중 하나가 너무 업데이 트됩니다. 사용자 엔티티가 변경되지 않았다는 것을 알고 있다면 Doctrine이 그 업데이트를 수행하는 이유를 이해할 수 없습니다. 또한 생성 된 (datetime) 개체 만 업데이트되며 다른 필드는 업데이트되지 않습니다.

카스 케이드 설정이 없으므로 조항 persist()에서 아무 것도 트리거하지 않아야합니다.

누구나?

답변

0

created_at 열에 대한 주석은 무엇입니까? 그리고 @PreUpdate 어노테이션은 User 클래스 또는 BaseUser 어딘가에 확장되어 있습니까?

또한; $ em-> merge ($ user)없이 같은 일을 시도해보십시오. 나는 그것을 사용한 적이 없으며 그것이 무엇을 위해 사용되는지 알지 못한다. 그러나 그것이 문제 일 수있다.

+0

사용자 또는 조항에 수명주기 또는 사전 업데이트 방법이 없습니다. 생성 된 필드에 대한 주석은 기본 @ORM \ Column (name = "created", type = "datetime", nullable = false)'입니다. 사용자 엔티티가 캐시에 저장되고 연관이 완료되기 전에 entityManager가 이에 대해 알아야하기 때문에 병합을 사용해야합니다. – maxwell2022