2013-10-29 51 views
0

创建我有其中一个具有一对多的关系与其他Grails的一对多的关系:没有数据库

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: 我注意到,也许问题取决于事实上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字段为空...我不明白为什么......我将打开另一个岗位来解决这个问题(解决here

回答

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 
    ... 
} 

一类,那么它在数据库中这些字段映射ID创建A_C 。

+0

我的情况是第二,事实上我没有一个属于在C类。事实是表A_C被正确创建,但是当我创建A对象时,A_C对象的实例从未被创建......并且我不知道为什么!我重新创建了数据库,并且我得到了相同的结果... – FrancescoDS

+0

您是使用默认脚手架还是编写自己的代码进行保存?如果您已经编写了自己的代码,请在此处发布您的代码。此外,我需要知道你如何在UI(_form.gsp)上映射这个关系。 – arvind

1

没有必要有一个与AB关系的中间表,当你建立了一对多关系时。如果关系是双向的(B类对象可能有多个A类对象),那么中间表将会很有用。

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

+0

我检查了B类,它没有外键给A类。请注意,该表格是在应用程序启动时由Grails自动创建的......我已删除并重新创建了数据库,但没有任何更改。但我错过了写一些其他有用的信息,所以我需要编辑我的问题 – FrancescoDS

+0

我现在还没有解决这个问题......任何人都可以做一些建议? – FrancescoDS

0

我现在沟里的中间表并添加以下B级 static belongsTo = [parent:A] (保持在一个对的hasMany):

这将创建一个从B到A(又名外键的双向关系在B表中)。确保你意识到如何级联删除与belongsTo一起处理。 http://grails.org/doc/2.2.x/ref/Domain%20Classes/belongsTo.html

您提到了预填充。确保你没有违反任何限制。 Bootstrap经常失败。添加像您的实例中的问题: ` 如果{ b.errors.each { 的println它 }}

` 你得到这个关系工作后,采取(b.save()!)如果你需要使用中间表来重构你的关系以表现gorm的表现,那么看看这个话题。http://www.infoq.com/presentations/GORM-Performance

+0

也许你有意在C类中添加静态...?或者你的意思是B班? – FrancescoDS

+0

关于infoq谈话,是否有可能有一些关于它的提取?我不能下载幻灯片,我不知道它为什么会给我一个错误... – FrancescoDS