我继承了我需要维护的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
}
}
}
在创建SpecialAppointment的控制器中,以Appointment作为基类,我需要创建并保存AppointmentHistory的新实例,它与Appointment有关系。
def app = new SpecialAppointment()
// set fields here
app.save(flush:true)
// save history log
def history = new AppointmentHistory(appointment: app)
我在创建历史对象时传递了SpecialAppointment的实例,但这是错误的,因为它使用的是ID而不是Appointment的ID。
不幸的是,我无法找出正确的语法来从刚刚保存的派生类实例中访问超类的成员。
请告知。
答案 0 :(得分:0)
作为Appointment的sublcass的SpecialAppointment在表中只生成一个对象和一行,因此它们具有公共ID。继承不是一个子对象包含超级对象,而是一个子对象IS作为超级对象的关系
换句话说,它使用SpecialAppointment的ID很好,因为SpecialAppointment也可以被Appointment类对象引用
答案 1 :(得分:0)
真正的问题是域类之间的关系没有正确设置。
AppointmentHistory
需要belongsTo Appointment
,Appointment
需要hasMany AppointmentHistory
。必须将历史记录项添加到app.addHistoryItem(history)
的约会中。
这些变化解决了这个问题。
感谢大家的支持。