2011-05-03 3 views
3

클래스 표 상속 전략을 사용하여 D2로 상속 매핑을 구현하고 있습니다. 나는 다음과 같은 코드 블록Doctrine의 판별 자 문제점 2

namespace Zain\Entity; 
/** 
* @Entity 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="Specialty", type="string") // what other types exist? 
* @DiscriminatorMap({"person" = "\Zain\Person", "employee" = "\Staff\Entities\Employee"}) 
* 
* @Table(name="db_One.tblPerson") 
* 
*/ 
class Person 
{ 

... 

과 사람이라는 부모 클래스를 가지고 그리고 난 다음 코드를 사용하여 자식 클래스라는 이름의 직원이 있습니다

namespace Staff\Entities; 

/** 
* Description of Employee 
* @Entity 
* @Table(name="db_Two.tblEmployee") 
* 
*/ 

class Employee extends \Zain\Entity\Person 
{ 

... 

MySQL의 테이블 : tblPerson는 특수라는 차별 열이

`Specialty` varchar(45) NOT NULL 

직원의 인스턴스가 있고이를 유지하려고 할 때 문제가 발생합니다.

Employee 인스턴스가 지속되면 employee 인 employee (string)가 Person 테이블의 Specialty 열에 저장 될 것으로 예상됩니다. 그러나 이것은 발생하지 않았습니다. 나는이 오류가 값이 생성되고 EntityManager에 의해 사용되는 SQL 문에서 특수 열의 전달되지되고 있음을 의미 이해

Message: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'specialty' cannot be null 

: 나는 오류 메시지가 발생합니다. 그리고 tblPerson> Specialty Column에 Not Null 제약 조건을 설정했습니다.

not null 제약 조건을 제거하면이 작업을 수행 할 수 있지만 그 목적을 상회합니다. 이것을 도와 주면서, 지속 호출 중에 엔티티 관리자가 사용/생성 한 SQL 문을 검색하는 방법을 보여 주시겠습니까?

답을 찾기 위해 며칠 동안 끝내는 것이 좋을 것입니다. 다시 한번 감사드립니다.

답변

2

Doctrine은 다양한 유형을 지원합니다. DiscriminatorMap에서 주로 사용되는 것은 문자열과 정수 (및 그 파생어 : bigint, smallint, float, ...)입니다.

글쎄, 내게 문제는 당신이 말하는 클래스 이름 인 것 같습니다. 클래스 이름의 문자열 표현은 항상 루트 네임 스페이스를 가리키므로 시작 부분에 "\"를 포함하면 문제가 발생합니다. 삭제하고 작동하는지 확인해 보시기 바랍니다.

+0

그건 분명히 '마술'을 완료했습니다 - 고마워요. –

+0

뛰어난 요청은 다음과 같습니다 : 이것을 돕기 위해, 생성 된 SQL 문을 검색하는 방법을 보여 주시겠습니까? 끊임없는 전화? –

+0

@pi - doctrine 용 SQL Logger를 구성해야합니다. 여기 세부 정보 : http://www.doctrine-project.org/docs/orm/2.0/en/reference/configuration.html#sql-logger-optional – rojoca

관련 문제