2011-05-03 124 views
3

我正在使用Class Table Inheritance策略實現與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 
{ 

... 

一個父類,我有下面的代碼名爲Employee的子類:

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(string)將被保存在Person Person的專業列中。 但是這並沒有發生。我遇到的錯誤消息:

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

我明白這錯誤意味着沒有值被傳遞用於產生和被EntityManager使用SQL語句中的特殊列。並且我已經在tblPerson> Specialty Column上設置了一個Not Null約束。

如果我刪除了非空約束,我可以得到這個工作 - 但是這會破壞目的。爲了解決這個問題,你能告訴我如何檢索在持續調用期間被實體管理器使用/將要使用的生成的SQL語句嗎?

如果能結束好幾天的搜索答案,那將是一件非常棒的事情。再次感謝。

回答

2

主義支持多種類型。 DiscriminatorMap中主要使用的是字符串和整數(及其派生:bigint,smallint,float,...)。

那麼,這個問題似乎是你指的類名。 類名的字符串表示總是指向根名稱空間,所以在開始時包括「\」只會導致麻煩。 我建議你將其刪除並檢查它是否有效。

+0

這肯定已經完成的「魔力」 - 非常感謝 – 2011-05-03 14:51:58

+0

未完成的請求,雖然是:在幫助了這一點,請你告訴我如何檢索使用生成的SQL語句/由實體管理過程中使用堅持不懈的呼籲? – 2011-05-03 14:53:27

+0

@pi - 你需要配置SQL記錄儀的教義。詳情點擊此處:http://www.doctrine-project.org/docs/orm/2.0/en/reference/configuration.html#sql-logger-optional – rojoca 2011-05-03 17:05:50