การแมปวัตถุโดเมนหลายรายการกับตารางเดียวกันโดยใช้ GORM DSL

ฉันกำลังสร้างแอป grails บนฐานข้อมูลเดิม
มีตารางที่ฉันต้องการสร้างวัตถุโดเมนที่แตกต่างกันหลายรายการ (Type1, Type2 และ Type3 ในตัวอย่างของฉันด้านล่าง)
ตารางเป็นเหมือน นี้ :

ID    TYPE    DESCRIPTION
1     type1   description of a type1 object
2     type1   description of another type1 object
3     type2   description of a type2 object
4     type3   description of a type3 object
...

ดังนั้นฉันจึงต้องการสร้างคลาสโดเมนที่แตกต่างกัน 3 คลาส โดยแต่ละคลาสจะมีฟิลด์ชื่อ "คำอธิบาย" และสอดคล้องกับ "ประเภท" ที่เฉพาะเจาะจง เนื่องจากแถวต่างๆ แสดงถึงแนวคิดที่แตกต่างกัน

มีข้อจำกัดใดบ้างที่อนุญาตให้ฉันกรองแถวตามประเภท

ฉันหมายถึงฉันสามารถทำอะไรบางอย่างเช่น:

class Type1 {
    String type
    String description

    static mapping = {
       table 'mytable'
    }

    static constraints = { type == 'type1' } // Is there anything like this ?

 }

จากนั้นฉันคาดหวังว่า Type1.list() จะสร้างแบบสอบถามเช่น:

SELECT type, description 
FROM mytable
WHERE type = 'type1'

อัปเดต :

จริงๆ แล้ว เอกสารประกอบ บอกว่าฉันสามารถใช้ discriminator เพื่อให้บรรลุผลได้ นี้.

อย่างไรก็ตาม ฉันพยายามกำหนดชั้นเรียนของฉันดังนี้:

class Type1 extends BaseType {

  static mapping = {
    discriminator column:'type', value: 'type1'
  }

}

ฉันเปิดใช้งานการติดตาม SQL ไฮเบอร์เนตและแทนที่จะเห็น

SELECT ... FROM mytable WHERE type = 'type1'

ฉันเห็น

SELECT ... FROM mytable WHERE class = 'type1'

ดูเหมือนว่าผู้เลือกปฏิบัติจะเพิกเฉยต่อชื่อคอลัมน์ที่กำหนดเองของฉันโดยสิ้นเชิง :-(

ฉันใช้ Grails 1.2.1


person Philippe    schedule 04.03.2010    source แหล่งที่มา


คำตอบ (2)


ตกลง เอกสาร Grails จึงไม่ทันสมัย ​​(แต่ควร)

วิธีแก้ไขคือ:

ในคลาส BaseType :

static mapping = { discriminator column:"type" }

ในคลาสย่อย:

static mapping = { discriminator value:"type1" } // or type2, type3, etc...
person Philippe    schedule 04.03.2010

เอกสาร GORM ดูเหมือนจะแนะนำให้คุณทำได้ ตราบใดที่คลาส TypeX ทั้งหมดของคุณขยายคลาสพื้นฐานทั่วไป

person tim_yates    schedule 04.03.2010
comment
ใช่ ฉันกำลังพยายามอย่างนั้น... แต่ตารางของฉันไม่มีคอลัมน์ 'คลาส'... ฉันจะพยายามแมปคอลัมน์ TYPE กับตัวแยกแยะคลาส และดูว่าได้ผลหรือไม่... - person Philippe; 04.03.2010