【问题标题】:Grails: domain class mapping (collection of hibernate user types)Grails:域类映射(hibernate用户类型的集合)
【发布时间】:2011-04-30 02:19:18
【问题描述】:

我想知道是否可以实现以下领域模型。

让我们有一个包含一组间隔(joda time)的域类。我可以使用 org.joda.time.contrib.hibernate.PersistentInterval hibernate 用户类型将 Interval 映射到数据库表(通过与http://www.grails.org/JodaTime+Plugin 类似的方式)。但是,如果我有一组间隔,而不仅仅是一个间隔,我无法弄清楚如何实现映射。

例子:

class Activity {  
   ...    
   Set intervals = []  
   ...  
   static hasMany = [    
       intervals: org.joda.time.Interval  
   ]  

   // This is incorrect implementation, I have set of intervals  
   // and this would be correct if I had only one interval  
   // How to implement mapping in this case?  
   static mapping = {  
       intervals type: PersistentInterval, {  
           column name: "start"  
           column name: "end"  
       }  
   }  

}

上面的实现失败并出现以下错误:

2010-10-23 18:30:25,483 [主要] 错误 context.GrailsContextLoader - 错误 执行引导程序:创建错误 名为'messageSource'的bean: bean初始化失败;嵌套的 例外是 org.springframework.beans.factory.BeanCreationException: 创建具有名称的 bean 时出错 'transactionManager':无法解决 对 bean 'sessionFactory' 的引用 在设置 bean 属性时 '会话工厂';嵌套异常是 org.springframework.beans.factory.BeanCreationException: 创建具有名称的 bean 时出错 'sessionFactory':初始化的调用 方法失败;嵌套异常是 org.hibernate.MappingException: 外键 (FK4FDC5B1E5107CA0:activity_intervals [start,end])) 必须有相同数量的 列作为引用的主键 (活动 [id]) org.springframework.beans.factory.BeanCreationException: 创建具有名称的 bean 时出错 'messageSource':初始化 豆失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException: 创建具有名称的 bean 时出错 'transactionManager':无法解决 对 bean 'sessionFactory' 的引用 在设置 bean 属性时 '会话工厂';嵌套异常是 org.springframework.beans.factory.BeanCreationException: 创建具有名称的 bean 时出错 'sessionFactory':初始化的调用 方法失败;嵌套异常是 org.hibernate.MappingException: 外键 (FK4FDC5B1E5107CA0:activity_intervals [start,end])) 必须有相同数量的 列作为引用的主键 (活动 [id]) 在 org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:212)

我认为解决此问题的方法是提取 Interval 以分离扩展 Interval 的域类并在其中指定映射。但是,Interval 是 final 类,因此无法扩展。

感谢您的建议。

【问题讨论】:

    标签: hibernate grails mapping usertype grails-domain-class


    【解决方案1】:

    我正在回答我自己的问题,也许这个答案对某人有用。

    到目前为止,我只找到了一种实现给定模型的方法 - Hibernate XML mapping files

    <hibernate-mapping package="mappingtest">  
        <class name="Activity">  
            <id name="id">  
                <generator class="native"/>  
            </id>  
            <set name="intervals">  
                <key column="activity_id" not-null="true"/>  
                <element type="org.joda.time.contrib.hibernate.PersistentInterval">  
                    <column name="startDate"/>  
                    <column name="endDate"/>  
                </element>  
            </set>  
        </class>  
    </hibernate-mapping>  
    

    和领域类实现:

    class Activity {    
        Long id    
        Set intervals = []
    
        static constraints = {
        }
    }
    

    我还必须将域类从 grails-app/domain 移动到 src/groovy 目录,否则应用程序运行失败(grails-1.3.5):

    ...
    org.hibernate.DuplicateMappingException: 重复的类/实体映射 映射测试.Activity
    ...

    我发现上述实现的第二个问题是,当我通过以下方式打开脚手架(出于测试目的)时:

    class ActivityController {
        static scaffold = true
        ...
    }
    

    显示创建的活动失败并出现错误:

    异常消息:没有这样的属性: 班级 ID:org.joda.time.Interval 可能的解决方案:结束原因: 评估表达式 [i.id] 时出错 第 [38] 行:没有这样的属性:id for 类:org.joda.time.Interval 可能 解决方案:结束

    但手动实现从数据库获取活动及其显示的工作。

    编辑:另外我找到了脚手架和 DuplicateMappingException 问题的解决方案。它们是由 Activity.hbm.xml 的无效位置引起的 - 缺少包目录结构。正确的位置是 grails-app/conf/hibernate/mappingtest/Activity.hbm.xml。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多