groovy grails构建测试数据(buildtestdata插件)如何创建多对多

Posted

技术标签:

【中文标题】groovy grails构建测试数据(buildtestdata插件)如何创建多对多【英文标题】:groovy grails build test data (buildtestdata plugin) how to create many to many 【发布时间】:2013-11-26 20:39:37 【问题描述】:

使用 Grails 2.2.4。和构建测试数据:2.0.5。我无法使用 conf - Bootstrap.groovy 在数据库中添加多对多实例。使用 mysql 作为数据库。

这是简化的域类:

class Reseller 
String resellerName
static hasMany = [addresses: Address]

class Address 
String address1 
static hasMany = [resellers: Reseller]
static belongsTo = [Reseller]   

这会导致在运行时在 MySQL 中创建...

(下面是一个简单的 ER 图,因为我无法从 MySQL Workbench Diagram 发布图像)

经销商 ==> 1 对多==> reseller_address

如果不存在则创建表 address ( id bigint(20) NOT NULL AUTO_INCREMENT, version bigint(20) 非空, address1 varchar(255) 非空, 主键 (id) ) ENGINE=InnoDB 默认字符集=utf8 AUTO_INCREMENT=1 ;

如果不存在则创建表 reseller ( id bigint(20) NOT NULL AUTO_INCREMENT, version bigint(20) 非空, reseller_name varchar(255) 非空, 主键 (id) ) ENGINE=InnoDB 默认字符集=utf8 AUTO_INCREMENT=2 ;

如果不存在则创建表 reseller_addresses ( address_id bigint(20) 非空, reseller_id bigint(20) 非空, 主键 (reseller_id,address_id), 键FK3F39FB15CB44906F (reseller_id), 键FK3F39FB1541937EA5 (address_id) ) ENGINE=InnoDB 默认字符集=utf8;

更改表reseller_addresses 添加约束FK3F39FB1541937EA5外键(address_id)参考addressid), 添加约束 FK3F39FB15CB44906F 外键 (reseller_id) 引用 reseller (id);

这是 Bootstrap.groovy:

    import grails.buildtestdata.mixin.Build
import manytomany.*

class BootStrap 

    def init =  servletContext ->
        Address ad1 = Address.build()
        Reseller rs1 = Reseller.build()

        //comment out next line to run and see tables being built.
        rs1.addToAddresses(address: ad1) //does not work.  see error below                      
    
    def destroy = 
    

上面的结果会导致下面的错误。它还导致数据库中的零表在 MySQL 中。我可以看到它们被创建,然后它们在下面的错误中消失。

    | Running Grails application
Hibernate: insert into address (version, address1) values (?, ?)
Hibernate: insert into reseller (version, reseller_name) values (?, ?)
| Error 2013-11-13 17:37:01,543 [localhost-startStop-1] ERROR hibernate.AssertionFailure  - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
Message: null id in manytomany.Address entry (don't flush the Session after an exception occurs)
    Line | Method
->>  334 | innerRun  in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    166 | run       in java.util.concurrent.FutureTask
|   1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    615 | run       in java.util.concurrent.ThreadPoolExecutor$Worker
^    724 | run . . . in java.lang.Thread
| Error 2013-11-13 17:37:01,628 [localhost-startStop-1] ERROR context.GrailsContextLoader  - Error initializing the application: null id in manytomany.Address entry (don't flush the Session after an exception occurs)
Message: null id in manytomany.Address entry (don't flush the Session after an exception occurs)
    Line | Method
->>  334 | innerRun  in java.util.concurrent.FutureTask$Sync
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    166 | run       in java.util.concurrent.FutureTask
|   1145 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    615 | run       in java.util.concurrent.ThreadPoolExecutor$Worker
^    724 | run . . . in java.lang.Thread

【问题讨论】:

【参考方案1】:

试试这个方法,你可以通过.build(...)把你的关联传递给父类:

def init =  servletContext ->
    Address ad1 = Address.build()
    Reseller rs1 = Reseller.build(addresses:[ad1])
 

文档:https://github.com/tednaleid/build-test-data/wiki/SampleCode

【讨论】:

谢谢!那行得通-但无论如何,我在示例代码中看不到那种示例。我错过了吗?您能否指出 Grails 文档,该文档讨论 [ad1] 周围的 [括号] 如何工作 - 以及它们的含义? (我可以猜到它们的意思,但是对于 Grails 来说是新手,很难找到解释)。我试过:Reseller rs1 = Reseller.build(addresses:ad1) 没有括号但它失败了(尽管我在上面的问题中打错了)。 addresses 是一个列表,所以我只是将ad1 放在一个列表中。在我发布的链接上,看看它在哪里说 // build the issue first ,它构建了问题,然后将它传递到 Page 域,除非你的情况是一个列表。 啊——一个列表。括号是列表的语法......谢谢!这是文档...groovy.codehaus.org/Collections。现在,一切都清楚了。

以上是关于groovy grails构建测试数据(buildtestdata插件)如何创建多对多的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 在构建 Grails 项目时给出 ClassNotFoundException

声纳的 Groovy/Grails 插件

如何使用 @Build 为 grails 集成测试创建多种类型的测试数据

groovy build job 的参数里还可以用变量吗

Grails - 将数据添加到 bootstrap.groovy 时不会打开 localhost

Grails:在普通的 groovy 类中获取数据源