2011-05-31 132 views
0

我剛開始在一個新項目中使用Hibernate,並且使用第一個實體時,出現了一個我似乎無法弄清楚的錯誤。休眠無法加載實體錯誤

我現在的模式只是兩個表,大洲和國家,其中國家有一個continentid外鍵。

當我嘗試運行調用continents實體的代碼時,我得到一個空白頁。所有處理都停止,但不顯示錯誤。當我通過MXUnit運行代碼時,實際發生錯誤。錯誤消息只是Could Not Load an Entity: [continent#1]。異常的原因是org.hibernate.exception.SQLGrammarException。這就是我所得到的。

我的實際實體的代碼是:

Continent.cfc

component tablename='continents' persistent=true output=false{ 
    property name='id' type='numeric' fieldtype='id' datatype='integer'; 
    property name="name" type='string' length='45'; 
    property name='bonus' type='numeric'; 
    property name='countries' type='array' fieldtype='one-to-many' cfc='Country' singularname='country' inverse='true' fkcolumn='continentid' cascade='all-delete-orphan'; 

    public Country function init(string name='', numeric bonus=0){ 
     setName(Arguments.name); 
     return this; 
    } 
} 

Country.cfc

component tablename='countries' persistent=true output=false{ 
    property name='id' type='numeric' fieldtype='id' datatype='integer' generator="identity"; 
    property name="name" type='string' length='45'; 
    property name='continent' fieldtype='many-to-one' fkcolumn='continentid' cfc='Continent' missingRowIgnored=true; 

    public Country function init(string name=''){ 
     setName(Arguments.name); 
     return this; 
    } 
} 

並調用該方法的代碼。它是在一個ColdSpring豆

ContinentBean.cfc

component { 
    property name="continent" type="any"; 

    public any function init(any continent=''){ 
     if(len(Arguments.continent))setContinent(Arguments.continent); 
     return this; 
    } 

    public any function getContinent(){ 
     return continent; 
    } 
    public void function setContinent(numeric continent){ 
     continent = EntityLoad('Continent', Arguments.continent, true); 
    } 

    public void function setMapService(mapService){variables.instance['mapService'] = Arguments.mapService;} 
    public any function getMapService(){return variables.instance['mapService'];} 
} 

我找不到真正關心的錯誤消息,我可以瞭解任何信息,所以這可能僅僅是一個無效的語法的事情。

+0

唯一讓我覺得奇怪的是'datatype'。我從來沒有用過它,我認爲只有''ormtype''和''sqltype''。你可以嘗試刪除它並做一個'ORMReload()'看看它是否有效?另外,仔細查看堆棧跟蹤,有時你會看到一些有用的東西。然後打開ormsettings.logsql來檢查生成的SQL是否有意義。 – Henry 2011-06-01 00:10:24

回答

4

問題是我使用了錯誤的屬性來指定要在對象中映射的表名。該屬性應該是表=「」,所以我的休眠對象應該是這樣的:

Continent.cfc

component table='continents' persistent=true output=false{ 
} 

Country.cfc

component table='countries' persistent=true output=false{ 
} 
0

你的數據庫模式是什麼樣的?當你的對象中的數據類型不符合你的數據模型中的數據類型時,我已經看到了SQL Grammer的execptions拋出。

0

什麼是您的數據庫引擎? 我們可以看到你的orm應用程序配置嗎?

就我個人而言,我從來沒有見過屬性'datatype',我沒有在文檔中找到它。 如果您想強制數據類型,我建議您使用'sqlType'。通常,我與日期時間使用它:

property name="creationDateTime" type="date" sqltype="datetime"; 

我必須指定sqltype="datetime"因爲type="date"是不夠的。

1

這可能是因爲表結構的情況下與java類中映射的不同。

0

確保ID的配置設置有數據類型明確 例如:改變

< id name="id" column="ID"/> to <`ID名稱= 「ID」 列= 「ID」 類型=「java.lang中。長「 />