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);
但这似乎并没有奏效。任何帮助将不胜感激:)
答案 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_id
和invoice_id
),因此对于一个item
和一个invoice
你将只有一个invoiceitem
行,除非您希望invoiceitem
中有重复的行,因此无效。
所以基本上你需要中间表invoiceitem
意味着你在invoice
和item
之间有多对多的关系。
在Grails中,你这样做,简单:
class Invoice {
static belongsTo = [item: Item]
static hasMany = [items: Item]
}
class Item {
String name
static belongsTo = [invoice: Invoice]
static hasMany = [invoices: Invoice]
}
您可以将名称items
和invoices
更改为您喜欢的名称。
因此,当您创建上述两个域类时,hibernate知道它是多对多的关系,它需要 规范化 并自动创建中间表:{{1} }或invoiceitem
,其中包含invoice_id和item_id。
将项目添加到发票:
iteminvoice
向项目添加发票:
invoiceInstance.addToItems(itemInstance)