我在使用继承时相关表ID字段从域对象返回“null”时遇到问题。这是一个例子:
在/ src / groovy /
BaseClass1.groovy
class BaseClass1 {
Long id
static mapping = {
tablePerConcreteClass true
}
}
BaseClass2.groovy
class BaseClass2 extends BaseClass1 {
String someOtherProperty
static constraints = {
someOtherProperty(maxSize:200)
}
static mapping = BaseClass1.mapping
}
在/ grails-app / domain中
ParentClass.groovy
class ParentClass extends BaseClass2 {
ChildClass myChild
static mapping = BaseClass2.mapping << {
version false
}
}
ChildClass.groovy
class ChildClass extends BaseClass1 {
String property
static mapping = BaseClass1.mapping
}
问题出现在这里:
SomeotherCode.groovy
print parentClassInstance.myChild.id // returns the value
print parentClassInstance.myChildId // returns null
有什么想法可以使这些动态属性像这样破裂吗?
最佳答案
在调试到get(AssociationName)Id源之后,我发现了以下内容:
处理程序是:
GrailsDomainConfigurationUtil.getAssociationIdentifier(Object target, String propertyName,
GrailsDomainClass referencedDomainClass) {
String getterName = GrailsClassUtils.getGetterName(propertyName);
try {
Method m = target.getClass().getMethod(getterName, EMPTY_CLASS_ARRAY);
Object value = m.invoke(target);
if (value != null && referencedDomainClass != null) {
String identifierGetter = GrailsClassUtils.getGetterName(referencedDomainClass.getIdentifier().getName());
m = value.getClass().getDeclaredMethod(identifierGetter, EMPTY_CLASS_ARRAY);
return (Serializable)m.invoke(value);
}
}
catch (NoSuchMethodException e) {
// ignore
}
catch (IllegalAccessException e) {
// ignore
}
catch (InvocationTargetException e) {
// ignore
}
return null;
}
它在相关类(value.getClass()。getDeclaredMethod)上引发了异常,为方法getId()表示NoSuchMethod。我无法从基类中删除id声明,而Grails则抱怨需要一个标识符列。我尝试将ID标记为公开,但它也抱怨说ID不存在。所以,我尝试了
BaseClass {
Long id
public Long getId() { return this.@id }
}
在某些类(class)上工作正常,但在另一些类(class)上则无效。
删除ID声明后,出现错误:“未找到身份属性,但在域类中是必需的”。一时兴起,我尝试将@Entity添加到具体的类和中提琴中!一切开始起作用。
class BaseClass {
//Don't declare id!
}
@Entity
class ParentClass {}
@Entity
class ChildClass {}
我仍然认为这是一个需要添加的grails错误,但至少它很容易解决。