grails一对多关系:没有在数据库上创建的条目

时间:2013-10-29 13:22:48

标签: database select grails one-to-many relation

我有两个域类,其中一个与另一个

有一对多的关系
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}})

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