Hibernate не может загрузить ошибку объекта - PullRequest
0 голосов
/ 01 июня 2011

Я только начал использовать Hibernate в новом проекте, и с моей первой сущностью я получил ошибку, которую, похоже, не могу понять.

Моя схема сейчас - это только две таблицы, континентыи страны, в которых страна имеет внешний ключ континентида.

Когда я пытаюсь запустить код, который вызывает сущность континентов, я получаю пустую страницу.Вся обработка просто останавливается, но ошибка не отображается.Когда я запускаю код через 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'];}
}

Мне не удалось найти какую-либо информацию о сообщении об ошибке, которую я мог бы понять, так что это может быть просто неверный синтаксис.

Ответы [ 5 ]

4 голосов
/ 01 июня 2011

Проблема заключалась в том, что я использовал неправильный атрибут, чтобы указать имя таблицы для сопоставления в объектах.Атрибут должен быть table = '', поэтому мои объекты гибернации должны выглядеть так:

Continent.cfc

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

Country.cfc

component table='countries' persistent=true output=false{
}
1 голос
/ 21 ноября 2012

Может случиться так, что структура таблицы отличается от того, что отображено в классе Java.

0 голосов
/ 12 августа 2016

Убедитесь, что в конфигурации ID явно указан тип данных.

Например, измените это:

<id name="id" column="ID"/>

На это:

<id name="id" column="ID" type="java.lang.Long"/>
0 голосов
/ 01 июня 2011

Какой у вас движок БД?Можем ли мы увидеть конфигурацию вашего приложения orm?

Лично я никогда не видел свойства 'datatype' и не нашел его в документации.Я рекомендую вам использовать 'sqlType', если вы хотите форсировать тип данных.Обычно я использую его с datetime:

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

Я должен указать sqltype="datetime", потому что type="date" недостаточно.

0 голосов
/ 01 июня 2011

Как выглядит схема вашей базы данных?Я видел, как выполняются исключения SQL Grammer, когда типы данных в ваших объектах не совпадают с типами данных в вашей модели данных.

...