【问题标题】:How do I get an Instance of a class instead of its subclass?如何获取类的实例而不是其子类?
【发布时间】:2015-10-16 09:21:14
【问题描述】:

我有 2 个域:

事件:

class Incident {
    String title
    String description
}

static mapping = {
    tablePerHierarchy(false)
}

以及扩展 Incident 的 IncidentWithTimers:

class IncidentWithTimers extends Incident {
    int currentResponseTime
    Date responseTimeEndDate
}

IncidentWithTimers 不是数据库中的实际表,它是数据库视图。

现在,当我尝试从控制器获取 Incident 实例时,它会以某种方式返回 IncidentWithTimers 实例:

def index() {
    Incident curIncident = Incident.get(params.incident)
    println(curIncident.getClass())// "class IncidentWithTimers"
}

由于此域是一个视图,因此我通过在 IncidentWithTimers 类的 beforeInsert/Update/Delete 中抛出异常来禁用所有修改。

当我尝试修改和保存 curIncident 时,它会尝试访问 beforeUpdate(),并引发错误,而我一开始就不想更改 IncidentWithTimers

对此我能做些什么?

【问题讨论】:

  • params.incident 中的事件 ID 是否引用 IncidentIncidentWithTimers 的实例?
  • 两者都不是。 params.incident 从查询字符串中获取事件的值。 (所以 url.com/?incident=1 会返回 1)。
  • 我的意思是,按照您的示例,ID 为 1 的事件是 Incident 还是 IncidentWithTimers?此外,IncidentWithTimers 映射到的视图返回的 ID 是否来自 Incident 映射到的同一个表?是的,我的意思是两者应该共享相同的 ID“命名空间”。
  • 你是否禁用了版本字段 version false
  • @EmmanuelRosa IncidentWithTimers 是一个数据库视图,它将事件与其他一些计算字段相结合。因此,每个事件都是一个 IncidentWithTimers。

标签: grails


【解决方案1】:

问题是视图包含每个Incident,而不是像子类那样包含它们的子集。正如您所说,每个IncidentWithTimers 都是Incident

解决方案是使用查询而不是子类,或者使IncidentWithTimers 成为独立的重复类而不是子类。

我认为前者是最好的选择,因为意图很明确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-02
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2013-05-17
    相关资源
    最近更新 更多