grails - 建立一对多对一的关系

grails - setting up a one to many to one relationship

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);

但这似乎不起作用。任何帮助将不胜感激:)

尝试直接设置 InvoiceItemitem 属性:

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

或者如果您愿意:

InvoiceItem ii = new InvoiceItem(item: new Item(name: "Banana"))

然后确保保存更改。

我不太明白你的评论"There should only be one Invoice and one Item but many InvoiceItems."

我认为该声明无效,因为 invoiceitem table 将有两列(item_idinvoice_id),所以对于一个 item 和一个invoice 你将只有一个 invoiceitem 行,除非你想在 invoiceitem 中有重复的行,因此无效。

所以基本上你需要中间的 table 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 知道它是多对多的关系,它需要规范化并将自动创建中间 table: invoiceitemiteminvoice ,其中将包含 invoice_id 和 item_id.

要将项目添加到发票:

invoiceInstance.addToItems(itemInstance)

要向项目添加发票:

itemInstance.addToInvoices(invoiceInstance)