grails - 建立一对多关系

时间:2015-03-18 07:00:37

标签: grails gorm

class Invoice {
   static hasMany = [invoiceItem: InvoiceItem]
}

class InvoiceItem {
   static belongsTo = [invoice: Invoice, item: Item]
   static constraints = {
       invoice(nullable: false)
       item(nullable: false)
   }
}

class Item {
   String name
   static hasMany = [invoiceItem: InvoiceItem]
}

我们说我已经创建了一个发票,我不知道如何创建新商品并将其添加到发票中。

我在想:

Item item1 = new Item(name: "Banana")
InvoiceItem ii = new InvoiceItem(item_id: item1.id)
invoice.addToInvoiceItem(ii);

但这似乎并没有奏效。任何帮助将不胜感激:)

2 个答案:

答案 0 :(得分:0)

尝试直接设置item的{​​{1}}属性:

InvoiceItem

或者如果您愿意:

Item item1 = new Item(name: "Banana")
InvoiceItem ii = new InvoiceItem(item: item1)
invoice.addToInvoiceItem(ii);

然后确保保存更改。

答案 1 :(得分:0)

我真的不明白你的评论“应该只有一个发票和一个项目但很多InvoiceItems。”

我不认为该陈述是有效的,因为invoiceitem表将有两列(item_idinvoice_id),因此对于一个item和一个invoice你将只有一个invoiceitem行,除非您希望invoiceitem中有重复的行,因此无效。

所以基本上你需要中间表invoiceitem意味着你在invoiceitem之间有多对多的关系。

在Grails中,你这样做,简单:

class Invoice {
   static belongsTo = [item: Item]
   static hasMany = [items: Item]
}


class Item {
   String name
   static belongsTo = [invoice: Invoice]
   static hasMany = [invoices: Invoice]
}

您可以将名称itemsinvoices更改为您喜欢的名称。

因此,当您创建上述两个域类时,hibernate知道它是多对多的关系,它需要 规范化 并自动创建中间表:{{1} }或invoiceitem,其中包含invoice_id和item_id。

将项目添加到发票:

iteminvoice

向项目添加发票:

invoiceInstance.addToItems(itemInstance)