0

我有两个域类,其中一个与另一个具有一对多关系

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 表中。

为什么会发生这种行为?我必须控制什么来解决问题?

编辑:也许需要一些澄清。A类是描述发票的类,C类是描述发票项目的类。所以我需要在这两个类之间给出一个一对多的关系,但是如上所述,它并没有按预期工作......

编辑 2:我注意到问题可能取决于cElementsA 对象中的字段为空的事实。在视图中,我对该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字段为空......我不明白为什么......我将打开另一个帖子来解决这个问题(在这里解决)

4

3 回答 3

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。

于 2013-12-14T21:13:16.167 回答
1

当您建立了一对多关系时,不需要有一个带有 AB 关系的中间表。如果关系是双向的(B 类对象可以有多个 A 类对象),那么中间表将很有用。

检查您的数据库,您的 B 类对象是否包含指向 A 类对象的指针(外键)。如果他们这样做,您的 ORM 决定创建一对多关系,并且您的 AB 关系表不使用。

于 2013-10-29T13:53:06.783 回答
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 { println it } }

` 在你得到这个关系之后,如果你需要使用中间表重构你的关系以获得 gorm 性能,请看一下这个演讲。http://www.infoq.com/presentations/GORM-Performance

于 2013-12-14T16:59:51.717 回答