次のドメインモデルを実装できるかどうか疑問に思っています。
一連の間隔 (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 クラスなので拡張はできません。
アドバイスありがとうございます。