【问题标题】:Grails Conversion from Hibernate XML to GORM从 Hibernate XML 到 GORM 的 Grails 转换
【发布时间】:2011-09-17 10:26:58
【问题描述】:

我正在将我的 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 属性定义 内元素的类型 地图。地图的键必须是 字符串。

就我而言,我不希望地图成为字符串。问题:

  • 有什么方法可以在这里做我想做的事吗?也许通过使用静态映射变量?
  • 如果不是,我必须恢复旧的 Hibernate XML 文件吗?我可以只为我的项目中的一个域类执行此操作,而没有其他的 XML 文件吗?

谢谢。

【问题讨论】:

    标签: hibernate grails map mapping


    【解决方案1】:

    我发现尝试使用 GORM 从遗留应用程序中让一些东西在 grails 中工作并不是最简单的事情。您可以找到适合 99% 问题的解决方案,但您将花费更多时间尝试为最后 1% 的问题(如您的问题)找到一个简单的按钮。我认为您可以通过使用 transient 字段作为键 来完成此操作(注意有两种解决方案,我推荐第二种解决方案)...

    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);
            }
        }
    

    ALSO 你可以完全避免使用 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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2011-09-20
      • 2013-12-24
      相关资源
      最近更新 更多