1

我继承了一个需要维护的 Grails 1.3.9 项目。

有一种情况需要扩展控制器之一以记录扩展约会的创建。

约会的定义如下:

class Appointment implements Serializable{

    static mapping = {
        table 'appointment'
        version false
        tablePerHierarchy false
        id generator:'sequence', params:[sequence:'seq_te_id']
        cache true
        columns{
            id column:'te_id'
            start column: 'te_start'
            // Other columns follow
        }
     }
  }

特别预约:

class SpecialAppointment extends Appointment implements Serializable {

  static mapping = {
      table 'special_appointment'
      cache true
      columns{
          id column: 'pt_id'
          comment column: 'pt_name'
          // other columns
      }
   }
}

历史记录:

class AppointmentHistory {
    static mapping = {
        version false
        table 'appointment_history'
        id generator: 'sequence', params:[sequence:'seq_th_id']
        cache true
        columns {
            id column: 'th_id'
            termin column: 'pt_id'
            // other columns
        }
    }
}

在创建以 Appointment 作为其基类的 SpecialAppointment 的控制器中,我需要创建并保存与 Appointment 有关系的 AppointmentHistory 的新实例。

def app = new SpecialAppointment()
// set fields here

app.save(flush:true)

// save history log
def history = new AppointmentHistory(appointment: app)

我在创建历史对象时传递了 SpecialAppointment 的实例,但它是错误的,因为它使用了它的 ID,而不是 Appointment 的 ID。

不幸的是,我无法从刚刚保存的派生类实例中找出访问超类成员的正确语法。

请指教。

4

2 回答 2

0

SpecialAppointment 是 Appointment 的子类,在表中只产生一个对象和一行,因此它们具有共同的 ID。继承不是一个子对象包含超对象的关系,而是一个子对象也作为超对象

也就是说,使用SpecialAppointment的ID就可以了,因为SpecialAppointment也可以被Appointment类对象引用

于 2013-05-27T13:45:52.827 回答
0

真正的问题是域类之间的关系没有正确设置。

AppointmentHistory需要belongsTo AppointmentAppointment需要hasMany AppointmentHistory。必须将历史项目添加到约会中app.addHistoryItem(history)

这些变化解决了这个问题。

谢谢大家的支持。

于 2013-05-28T14:06:48.423 回答