我在使用继承时相关表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错误,但至少它很容易解决。

10-06 13:32
查看更多