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);
但这似乎不起作用。任何帮助将不胜感激:)
尝试直接设置 InvoiceItem
的 item
属性:
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_id
和 invoice_id
),所以对于一个 item
和一个invoice
你将只有一个 invoiceitem
行,除非你想在 invoiceitem
中有重复的行,因此无效。
所以基本上你需要中间的 table 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 知道它是多对多的关系,它需要规范化并将自动创建中间 table: invoiceitem
或 iteminvoice
,其中将包含 invoice_id 和 item_id.
要将项目添加到发票:
invoiceInstance.addToItems(itemInstance)
要向项目添加发票:
itemInstance.addToInvoices(invoiceInstance)
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);
但这似乎不起作用。任何帮助将不胜感激:)
尝试直接设置 InvoiceItem
的 item
属性:
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_id
和 invoice_id
),所以对于一个 item
和一个invoice
你将只有一个 invoiceitem
行,除非你想在 invoiceitem
中有重复的行,因此无效。
所以基本上你需要中间的 table 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 知道它是多对多的关系,它需要规范化并将自动创建中间 table: invoiceitem
或 iteminvoice
,其中将包含 invoice_id 和 item_id.
要将项目添加到发票:
invoiceInstance.addToItems(itemInstance)
要向项目添加发票:
itemInstance.addToInvoices(invoiceInstance)