2

次のドメインモデルを実装できるかどうか疑問に思っています。

一連の間隔 (joda 時間) を含むドメイン クラスを用意しましょう。org.joda.time.contrib.hibernate.PersistentInterval hibernate ユーザー タイプを使用して、Interval をデータベース テーブルにマッピングできます ( http://www.grails.org/JodaTime+Pluginと同様の方法で)。ただし、1 つの間隔だけでなく一連の間隔がある場合、マッピングを実装する方法がわかりません。

例:

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 [main] エラー context.GrailsContextLoader - ブートストラップの実行中にエラーが発生しました:「messageSource」という名前の Bean を作成中にエラーが発生しました: Bean の初期化に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'transactionManager' という名前の Bean の作成中にエラーが発生しました: Bean プロパティ 'sessionFactory' の設定中に Bean 'sessionFactory' への参照を解決できません。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'sessionFactory' という名前の Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.MappingException です: 外部キー (FK4FDC5B1E5107CA0:activity_intervals [start,end])) は、参照される主キー (アクティビティ [id]) org.springframework と同じ数の列を持つ必要があります。beans.factory.BeanCreationException: 「messageSource」という名前の Bean を作成中にエラーが発生しました: Bean の初期化に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'transactionManager' という名前の Bean の作成中にエラーが発生しました: Bean プロパティ 'sessionFactory' の設定中に Bean 'sessionFactory' への参照を解決できません。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'sessionFactory' という名前の Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.MappingException です: 外部キー (FK4FDC5B1E5107CA0:activity_intervals [start,end])) は、org.grails.tomcat.TomcatServer.start( TomcatServer.groovy:212) BeanCreationException: 'messageSource' という名前の Bean の作成中にエラーが発生しました: Bean の初期化に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'transactionManager' という名前の Bean の作成中にエラーが発生しました: Bean プロパティ 'sessionFactory' の設定中に Bean 'sessionFactory' への参照を解決できません。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'sessionFactory' という名前の Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.MappingException です: 外部キー (FK4FDC5B1E5107CA0:activity_intervals [start,end])) は、org.grails.tomcat.TomcatServer.start( TomcatServer.groovy:212) BeanCreationException: 'messageSource' という名前の Bean の作成中にエラーが発生しました: Bean の初期化に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'transactionManager' という名前の Bean の作成中にエラーが発生しました: Bean プロパティ 'sessionFactory' の設定中に Bean 'sessionFactory' への参照を解決できません。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'sessionFactory' という名前の Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.MappingException です: 外部キー (FK4FDC5B1E5107CA0:activity_intervals [start,end])) は、org.grails.tomcat.TomcatServer.start( TomcatServer.groovy:212) 「messageSource」という名前の Bean の作成中にエラーが発生しました: Bean の初期化に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'transactionManager' という名前の Bean の作成中にエラーが発生しました: Bean プロパティ 'sessionFactory' の設定中に Bean 'sessionFactory' への参照を解決できません。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'sessionFactory' という名前の Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.MappingException です: 外部キー (FK4FDC5B1E5107CA0:activity_intervals [start,end])) は、org.grails.tomcat.TomcatServer.start( TomcatServer.groovy:212) 「messageSource」という名前の Bean の作成中にエラーが発生しました: Bean の初期化に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'transactionManager' という名前の Bean の作成中にエラーが発生しました: Bean プロパティ 'sessionFactory' の設定中に Bean 'sessionFactory' への参照を解決できません。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'sessionFactory' という名前の Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.MappingException です: 外部キー (FK4FDC5B1E5107CA0:activity_intervals [start,end])) は、org.grails.tomcat.TomcatServer.start( TomcatServer.groovy:212) Bean の初期化に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'transactionManager' という名前の Bean の作成中にエラーが発生しました: Bean プロパティ 'sessionFactory' の設定中に Bean 'sessionFactory' への参照を解決できません。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'sessionFactory' という名前の Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.MappingException です: 外部キー (FK4FDC5B1E5107CA0:activity_intervals [start,end])) は、org.grails.tomcat.TomcatServer.start( TomcatServer.groovy:212) Bean の初期化に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'transactionManager' という名前の Bean の作成中にエラーが発生しました: Bean プロパティ 'sessionFactory' の設定中に Bean 'sessionFactory' への参照を解決できません。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'sessionFactory' という名前の Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.MappingException です: 外部キー (FK4FDC5B1E5107CA0:activity_intervals [start,end])) は、org.grails.tomcat.TomcatServer.start( TomcatServer.groovy:212) BeanCreationException: 名前が 'transactionManager' の Bean の作成中にエラーが発生しました: Bean プロパティ 'sessionFactory' の設定中に Bean 'sessionFactory' への参照を解決できません。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'sessionFactory' という名前の Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.MappingException です: 外部キー (FK4FDC5B1E5107CA0:activity_intervals [start,end])) は、org.grails.tomcat.TomcatServer.start( TomcatServer.groovy:212) BeanCreationException: 名前が 'transactionManager' の Bean の作成中にエラーが発生しました: Bean プロパティ 'sessionFactory' の設定中に Bean 'sessionFactory' への参照を解決できません。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'sessionFactory' という名前の Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.MappingException です: 外部キー (FK4FDC5B1E5107CA0:activity_intervals [start,end])) は、org.grails.tomcat.TomcatServer.start( TomcatServer.groovy:212) ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'sessionFactory' という名前の Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.MappingException です: 外部キー (FK4FDC5B1E5107CA0:activity_intervals [start,end])) は、org.grails.tomcat.TomcatServer.start( TomcatServer.groovy:212) ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'sessionFactory' という名前の Bean の作成中にエラーが発生しました: init メソッドの呼び出しに失敗しました。ネストされた例外は org.hibernate.MappingException です: 外部キー (FK4FDC5B1E5107CA0:activity_intervals [start,end])) は、org.grails.tomcat.TomcatServer.start( TomcatServer.groovy:212)

この問題の回避策は、Interval を抽出して Interval を拡張するドメイン クラスを分離し、その中でマッピングを指定することだと思いました。ただし、Interval は final クラスなので拡張はできません。

アドバイスありがとうございます。

4

1 に答える 1

3

私は自分の質問に答えています。多分この答えは誰かに役立つでしょう。

これまで、特定のモデルを実装する方法を 1 つだけ見つけました - Hibernate XML マッピング ファイル:

<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: 重複するクラス/エンティティ マッピング mappingtest.Activity
...

私が発見した上記の実装の2番目の問題は、次のようにして(テスト目的で)足場をオンにしたときです。

class ActivityController {
    static scaffold = true
    ...
}

作成されたアクティビティの表示がエラーで失敗しました:

例外メッセージ: そのようなプロパティはありません: クラスの id: org.joda.time.Interval .time.Interval 考えられる解決策: end

しかし、DBからのアクティビティの取得とその表示の手動実装は機能しました。

編集:さらに、足場と DuplicateMappingException の問題の解決策を見つけました。これらは、Activity.hbm.xml の無効な場所 (パッケージ ディレクトリ構造が見つからない) が原因でした。正しい場所は grails-app/conf/hibernate/mappingtest/Activity.hbm.xml です。

于 2010-10-26T16:43:03.533 に答える