Grails GORMは、抽象ドメインクラスをデータベースに永続化しないため、多態的な関係が失われます。例えば:
abstract class User {
String email
String password
static constraints = {
email(blank:false, nullable:false,email:true)
password(blank:false, password:true)
}
static hasMany = [membership:GroupMembership]
}
class RegularEmployee extends User {}
class Manager extends User {
Workgroup managedGroup
}
class Document {
String name
String description
int fileSize
String fileExtension
User owner
Date creationTime
Date lastModifiedTime
DocumentData myData
boolean isCheckedOut
enum Sensitivity {LOW,MEDIUM,HIGH}
def documentImportance = Sensitivity.LOW
static constraints = {
name(nullable:false, blank:false)
description(nullable:false, blank:false)
fileSize(nullable:false)
fileExtension(nullable:false)
owner(nullable:false)
myData(nullable:false)
}
}
原因
原因:org.hibernate.MappingException:テーブルドキュメントからの関連付けがマップされていないクラスを参照しています:User ... 25 more 2009-11-11 23:52:58,933[main]エラーmortbay.log-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です:
しかし、このシナリオでは、システムのすべてのユーザーを定義された役割の1つに適合させながら、すべてのユーザーがドキュメントを所有できるようにするという多態的な効果が必要です。したがって、ユーザーは直接インスタンス化されるべきではなく、抽象化されます。
非抽象ユーザークラスのロールに列挙型を使用したくないのは、特定のコンテキストでは意味をなさない可能性のある、さまざまなロールにプロパティを追加できるようにするためです(ロールがRegularEmployeeに設定されている単一のユーザーで、何らかの理由でnullではないmanagedGroupを取得します)。
これはGrailsのバグですか?私は何かが足りないのですか?