Преобразование Grails из Hibernate XML в GORM - PullRequest
4 голосов
/ 17 июня 2011

Я перевожу свой проект grails с использования Hibernate XML на просто GORM, определенный в классах домена. В одном предыдущем XML-файле определена карта:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="myproj" default-lazy="true">

    <class name="Season" table="seasons">
        <cache usage="read-only"/>
        <comment>Season</comment>
        <id name="id" type="long">
            <generator class="assigned">
            </generator>
        </id>

        <property name="seasonKey" column="season_key"/>
        <many-to-one name="league" class="Affiliation" column="league_id"/>
        <many-to-one name="publisher" class="Publisher"/>

        // MAP STARTS HERE
        <map name="seasonWeeks">
            <cache usage="read-write"/>          
            <key column="season_id"></key>
            <map-key column="week" type="int"/>
            <one-to-many class="SeasonWeek"/>
        </map>

    </class>

</hibernate-mapping>

Как видите, он создает карту Integer, SeasonWeek. Этот код ранее работал.

Когда я пытаюсь воссоздать карту в GORM, она не работает. Документация Grails 1.3.7 (версия, на которой я работаю) гласит:

Статическое свойство hasMany определяет тип элементов внутри Карта. Ключи для карты должны быть строки.

В моем случае я не хочу, чтобы карта была строкой. Вопросы:

  • Есть ли способ, которым я могу сделать то, что я хочу здесь? Может быть, с помощью статического отображения var?
  • Если нет, должен ли я восстановить старый XML-файл Hibernate? Могу ли я сделать это только для одного класса домена в моем проекте и не иметь XML-файлов для остальных?

Спасибо.

1 Ответ

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

Я обнаружил, что пытаться заставить некоторые вещи работать в Grails из устаревших приложений, использующих GORM, не самая простая вещь.Вы можете найти решение, которое подходит для 99% ваших проблем, но вы потратите гораздо больше времени, пытаясь найти легкую кнопку для последних 1% проблем (таких как ваша).Я думаю, что вы могли бы сделать это, используя переходное поле в качестве ключа что-то вроде ( обратите внимание, что есть два решения, я рекомендую второе ) ...

class Season {

    static mapping = {
        seasonWeeks mapKey: 'weekOfYearAsString' 
    }

    static hasMany = [seasonWeeks:SeasonWeek]

    Map seasonWeeks = [:]
}


 class SeasonWeek{

        ...

        String name
        Integer weekOfYearAsInt
        String weekOfYearAsString

        String getWeekOfYearAsString(){
            return String.valueOf(weekOfYearAsInt);
        }

        void setWeekOfYearAsString(def value){
            this.weekOfYearAsInt = Integer.parseInt(value);
        }
    }

ТАКЖЕ Вы можете полностью избежать GORM ( что бы я сделал ) и просто справиться с построением карты в своем классе Season ...

class Season{

   ...

    public Map getSeasonWeeksMap(){
        Map map = [:]
        def seasons = SeasonWeek.findBySeason(this.id)

        season.each(){season ->
            map.put(season.id, season)

        }

        return map
    }
}
...