2013-08-13 1 views
44

2 이후 주 관계를 통해 발견 된 새로운 요소를 세척하는 동안 우리는이 문제가됩니다교리는 - 새로운 엔티티는

CRITICAL: Doctrine\ORM\ORMInvalidArgumentException:

A new entity was found through the relationship 'Comment#capture' that was not configured to cascade persist operations for entity

그러나 capture가 이미 데이터베이스에, 그리고 우리는 그것을 얻고있다 우리 캐스케이드를 유지하거나 지속하는 경우 있도록 findOneBy에 의해, 우리는

Table constraint violation: duplicate entry.

코멘트를 새로, differents의 캡처와 루프에서 생성되며, 모든 필수 필드가 설정을 얻을. 모든 개체와

가 지속 및/또는 findOne (모든 유효)가있어, 플러시는 여전히 실패합니다. 이 어렵다 -

나는 잠시 이후이 문제에 대한, 그래서, 당신의 개체와 컨트롤러의 3 개 differents의 들여 쓰기처럼 참조하면 코드의 더주의를 기울여야한다, 나에게 모든

+2

컨트롤러 및 엔티티와 같은 몇 가지 코드를 보여줍니다. – cheesemacfly

+0

이것은 관련된 문제이며 도움이 될 수 있습니다. http://stackoverflow.com/questions/18171801/doctrineentent-relationship – Flip

+0

컨트롤러의 코드는 다음과 같습니다. http://pastebin.com/J0Keukfy, 및 여기 엔티티 주석의 필드는 http : // pastebin입니다.com/nG4rE1Pp – isundil

답변

9

먼저 도와주세요 읽기 및 Symfony2 coding standards 적합하지 않습니다.

컨트롤러의 코드 you show이 완전하지 않아, $this->activeCapture이 어디에서오고 있는지 알 수 없습니다. 당신의 내부에서 내가 감히 Capture 개체를 포함하는 $people['capture'] 있습니다. 이건 매우 중요합니다. $people['capture']에서 캡처 (다시, 우리가 온 곳에서 모르는) $this->entityManager보다 다른 EntityManager의에서/인출 지속되면

, Doctrine2 개체가 이미 지속되어 아무 생각이 없습니다.

모든 작업에 Doctrine Entity Manager의 동일한 인스턴스를 사용해야합니다 (EM 개체에서 spl_object_hash을 사용하여 인스턴스가 동일한 지 확인하십시오).

은 또한 캡처 객체가 무엇을해야 하는지를 EntityManager를 알 수 있습니다.

// Refreshes the persistent state of an entity from the database 
$this->entityManager->refresh($captureEntity); 

// Or 
// Merges the state of a detached entity into the 
// persistence context of this EntityManager and returns the managed copy of the entity. 
$captureEntity = $this->entityManager->merge($captureEntity); 

그래도 도움이되지 않으면 더 많은 코드를 제공해야합니다.

+0

내가 가지고있는 activeCapture 엔티티를 새로 고침하려고 시도했지만 아무 것도 ... "get ('doctrine.orm.default_entity_manager')"를 사용하기 때문에 하나의 EntityManager 만 가질 것이라고 확신합니다. $ this-> activeCapture는 http://pastebin.com/px0cyWs0와 getActiveCapture는 다음과 같습니다. http://pastebin.com/D0LRW2TD – isundil

+0

http://pastebin.com/의 Captures 36 행을 분리하는 이유는 무엇입니까? px0cyWs0? 캡처가 어딘가에서 참조되면 Doctrine은 더 이상 그것에 대해 알지 못하고 예외의 종류를 던질 수 있습니다. – Damien

+0

이 프로세스를 통해 캡처 링 엔티티를 새로 고칠 수는 있지만이 함수는 로그를 인쇄하고 호출되지 않습니다 (디버그가 인쇄되지 않음). – isundil

3

오류가 : 문제 엔티티

에 대한 작업을 지속 계단식으로 구성되지 않았습니다 '코멘트 # 캡처'

/** 
* @ORM\ManyToOne(targetEntity="Capture", inversedBy="comments") 
* @ORM\JoinColumn(name="capture_id", referencedColumnName="id",nullable=true) 
*/ 
protected $capture; 

구성 그나마이 폭포는

이 함께 노력 지속 :

/** 
* @ORM\ManyToOne(targetEntity="Capture", inversedBy="comments", cascade={"persist", "remove" }) 
* @ORM\JoinColumn(name="capture_id", referencedColumnName="id",nullable=true) 
*/ 
protected $capture; 
34

내 경우에는

$this->entityManager->clear(); 

문제를 일으켰습니다. 또한 저도 같은 문제가 있었다

$this->entityManager->clear($capture); 
38

처럼 만 최근 객체에 명확한를 수행하여 사라와 동일한 EntityManager이었다. 관련된 객체 인 ManyToOne을 삽입하고 싶습니다. 그리고 나는 cascadepersist를 원하지 않는다.

예 :

$category = $em->find("Category", 10); 

$product = new Product(); 
$product->setCategory($category) 

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

이 나를 위해 같은 예외가 발생합니다.

그럼 솔루션입니다 :

$category = $em->find("Category", 10); 

$product = new Product(); 
$product->setCategory($category) 

$em->merge($product); 
$em->flush(); 
+3

작동합니다. 하지만 왜? –

+3

Merge는 Doctrine이 동일한 ID를 가진 기존의 $ 제품을 찾고 ($ originalProduct라고 부름) $ product를 $ originalProduct와 병합합니다. 이것은 $ product의 모든 속성이 $ originalProduct에 복사된다는 부작용을 가지고 있습니다. 출처 : http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html 엔티티 X에 적용되는 병합 작업의 의미는 다음과 같습니다. X 분리 된 개체 인 경우 X의 상태는 동일한 ID의 기존 관리 대상 엔터티 인스턴스 X '에 복사됩니다. –

+3

그 해결책도 나에게 도움이되었지만 나는 그것에 만족하지 않는다. 나는 뭔가 어딘가에 (어쩌면 일부 설정 파일에서) 잘못된 일을해야한다고 생각한다. 나는 다른 프로젝트에서이 문제를 결코 겪지 않았다. –

1

내가 에 시도 할 때 새로운 엔티티를 추가도이 오류를 얻었다.

A new entity was found through the relationship 'Application\Entity\User#chats' 
that was not configured to cascade persist operations for entity: ###. 
To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or 
configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}). 

내 경우 엔 엔티티를 저장하려했으나 저장하면 안됩니다. 엔티티 릴레이션이 채워져 저장하려고 시도되었지만 (Many2Many에는 UserChat이 있지만 채팅은 임시 엔티티 임), 충돌이있었습니다.

그래서 cascade={"persist"}을 사용하면 원치 않는 동작이 발생합니다. 휴지통 엔티티가 저장됩니다. 내 솔루션은 저장 기관 중 비 절약 개체 제거했다 :

// User entity code 
public function removeFromChats(Chat $c = null){ 
    if ($c and $this->chats->contains($c)) { 
     $this->chats->removeElement($c); 
    } 
} 

저장 코드를

/* some code witch $chat entity */ 
$chat->addUser($user); 

// saving 
$user->removeFromChats($chat); 
$this->getEntityManager()->persist($user); 
$this->getEntityManager()->flush(); 
+0

이미 엔티티가 데이터베이스에 있다고 언급 했으므로이 질문과 관련하여 사용자의 대답이 의미가 없습니다. – Vivek

+0

@Vivek 글쎄, 나는이 페이지를 구글을 통해 가장 오류가있는 상대적인 것으로 생각했다. 그래서 나 혼자서 해결책을 찾아야했고 마침내 나는 같은 오류로 다른 사람들을 돕기 위해이 페이지를 떠났다. 그것이 당신에게 유익하지 않다면 나는 유감입니다. –

15

내 대답은 이처럼, 특정 사건에 대한 매우 관련 주제 관련 것이 아니라, 인터넷 검색을하는 사람들은 위의 답이 나를 도와주지 않았기 때문에 이것을 게시합니다.

필자의 경우 일괄 처리 엔티티와 관계가 있고 그 엔티티가 매우 동일한 엔티티로 설정된 것과 동일한 오류가 발생했습니다. 내가 뭘 잘못했는지

: 나는이 오류를 얻을 것이다 기관의 일괄 처리하는 동안 개체의 다음 배치가 분리 관련 엔티티를 가리 때문에 내가 $this->entityManager->clear();했다

. 내가 $this->entityManager->clear(); 만 repositorie`s 엔티티을 모두 분리 같은 $this->entityManager->detach($entity);으로 작동하는지 몰랐다

  1. : 무엇이 잘못되었는지

    .

  2. 나는 $this->entityManager->clear();도 관련 엔티티를 분리한다고 생각했습니다. 내가 했어야 무엇

:

내가 단체를 통해 반복하고 하나씩 분리해야 - 미래 실체가 가리키는 관련 개체를 분리하지 않을 것이라고.

이 정보가 도움이되기를 바랍니다.

+0

나 혼자서 그것을 찾지 못했을 것이다, 훌륭한 대답 감사합니다! – Hammerbot