0

使用旧数据库时,有时我无法使用belongs_to注释正确设置关系。在这种情况下,我尝试使用其访问器方法定义指向另一个Model类的属性,如下所示:

@Table("INTERVENTION")
@IdName("ITV_ID")
public class Intervention extends Model {
  private InterventionModel interventionModel;

    public InterventionModel getInterventionModel() {
        return interventionModel;
    }

    public void setInterventionModel(InterventionModel interventionModel) {
        this.interventionModel = interventionModel;
    }
}

InterventionModel在服务类中加载和设置没有问题如下(intervention实例存在):

private void loadInterventionModel(final Intervention intervention) {
        final InterventionModel model = InterventionModel.findById(intervention.getLongId());
        intervention.setInterventionModel(model);
    }

InterventionModel问题是当我尝试评估FreeMarker 模板中的属性时它不起作用:

"item_code:": ${intervention.intervention_model.imo_internal_code}

这是刷新的错误:

FreeMarker template error:
An error has occurred when reading existing sub-variable "intervention_model"; see cause exception! The type of the containing value was: extended_hash+string (app.models.Intervention wrapped into f.e.b.StringModel)

Caused by: java.lang.IllegalArgumentException: Attribute: 'intervention_model' is not defined in model: 'class app.models.Intervention.

我在这里缺少什么以及为什么它不能按预期工作?一般来说,如果我在模型中声明一个属性及其访问器(getter 和 setter),它是否可以在模板中访问:

mymodel.my_attribute
4

2 回答 2

0

如果您的类InterventionModel指向旧表,您可以这样做:

@Table("INTERVENTION")
@IdName("ITV_ID")
public class Intervention extends Model {
  private InterventionModel interventionModel;

    public InterventionModel getInterventionModel() {
        return interventionModel;
    }

    public void setInterventionModel(InterventionModel interventionModel) {
        this.interventionModel = interventionModel;
    }

    Object getImoProductLabel(){
        return interventionModel.imo_product_label();
    }
}

然后在模板中:

"label": "${intervention.imoProductLabel}"

这样,您将不仅为模板构建方法,还为代码中的其他位置构建方法,并抽象出您的遗留代码。

于 2018-09-24T17:59:29.220 回答
0

我想,我找到了原因。似乎当您在类模型中声明一个实例变量并且该变量不属于模型可用属性(表列)时,您应该使用snake_case而不是camelCase编写,即而不是声明:

public class Intervention extends Model {
...
  private InterventionModel interventionModel;

  public InterventionModel getInterventionModel() {
        return interventionModel;
    }

    public void setInterventionModel(InterventionModel interventionModel) {
        this.interventionModel = interventionModel;
    }

}

使用snake_case 版本:

private InterventionModel intervention_model;

public InterventionModel getIntervention_model() {
    return intervention_model;
}

public void setIntervention_model(InterventionModel intervention_model) {
    this.intervention_model = intervention_model;
}

这样,您将能够在模板中访问它作为模型中可用的其他变量:

"label": "${intervention.intervention_model.imo_product_label}"

一开始,我相信转换是自动完成的。您可以保留camlCase版本, - 在这种情况下,您也应该在模板中使用它:

"label": "${intervention.interventionModel.imo_product_label}"

希望这可以帮助。

于 2018-09-24T09:39:56.750 回答