我有两个域类,其中一个与另一个
有一对多的关系Class A
{
...
@NotNull
static hasMany = [bElements:B]
}
Class B
{
...
}
当我运行应用程序时,会创建关系表A_B,并在用户创建A对象时自动添加A_B表中的条目。然后我决定改变这种关系,因为我已经注意到在A类和C类之间建立关系会更好,所以A类现在已经
static hasMany = [cElements:C]
但是当我创建一个A类型的新对象(在创建一些C对象之后),在我的数据库中添加一个或多个C类型的对象时,我看不到进入A_C表的条目,但仅限于在一张桌子里。
为什么会发生这种行为?我必须控制什么来解决问题?
编辑: 也许需要一些澄清。 A类是描述发票的类,C类是描述发票项的类。所以我需要在这两个类之间给出一对多的关系,但如上所述,它不能按预期工作......
编辑2:
我注意到问题可能取决于A对象中的字段cElements
为空的事实。在视图中,我已将cElements
字段描述如下:
<g:select name="receiptItems" from="${HealthService.findAllByDoctor(Doctor.findBySecUser(new ReceiptController().getCurrentlyLoggedUser()))}"
multiple="multiple" optionKey="id"
optionValue="${{it.healthServiceType.healthService}}"
size="5" value="${receiptInstance?.healthServices*.id}" class="many-to-many"
onchange="${remoteFunction(
controller: 'Receipt',
action: 'sumReceiptItems',
params: '\'receiptItemsSelected=\' + jQuery(this).val()',
onSuccess: 'updateTotalAmount(\'totalAmount\', data, \'00000\')')}"/>
这是一个多选。在每次选择之后,使用remoteFunction
,调用来自控制器的方法进行一些计算并更新totalAmount字段。它工作得很好但是,当调用save
方法时,healthServices
字段为空...我不明白为什么......我会打开另一个帖子来解决这个问题(解决{ {3}})
答案 0 :(得分:2)
如果您声明类似
的类Class A
{
...
@NotNull
static hasMany = [cElements:C]
}
Class C
{
static belongsTo= [a:A]
...
}
在这种情况下,它不会创建A_C,但如果您将其声明为
Class A
{
...
@NotNull
static hasMany = [cElements:C]
}
Class C
{
//no belongTo
...
}
然后它在数据库中创建A_C以映射这些字段id。
答案 1 :(得分:1)
当您建立了一对多关系时,不需要具有A-B关系的中间表。如果关系是双向的(B类对象可以有多个A类对象),那么中间表将是有用的。
检查数据库是否B类对象包含指向A类对象的指针(外键)。如果他们这样做,您的ORM决定创建一对多关系,并且不使用您的A-B关系表。
答案 2 :(得分:0)
我现在要抛弃中间表并将以下内容添加到B类中
static belongsTo = [parent:A]
(将hasMany保留在A中):
这将创建从B到A(也就是B表中的外键)的双向关系。确保您了解了如何使用belongsTo处理级联删除。 http://grails.org/doc/2.2.x/ref/Domain%20Classes/belongsTo.html
你提到过预先填充。确保您没有违反任何限制。 Bootstrap经常无声地失败。在您的实例上添加类似的内容: ` if(!b.save()){ b.errors.each { 打印它 } }
` 在你建立这种关系之后,如果你需要使用中间表重构你的关系以获得gorm性能,请看一下这个话题。 http://www.infoq.com/presentations/GORM-Performance