簡體   English   中英

groovy grails構建測試數據(buildtestdata插件)如何創建多對多

[英]groovy grails build test data (buildtestdata plugin) how to create many to many

使用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對多==>轉銷商地址<==多對1 <==地址

如果不存在address創建表( id bigint(20)NOT NULL AUTO_INCREMENT, version bigint(20)NOT NULL, address1 varchar(255)NOT NULL,PRIMARY KEY( id ))ENGINE = InnoDB DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1;

如果不存在reseller創建表( id bigint(20)NOT NULL AUTO_INCREMENT, version bigint(20)NOT NULL, reseller_name varchar(255)NOT NULL,PRIMARY KEY( id ))ENGINE = InnoDB DEFAULT CHARSET = utf8 AUTO_INCREMENT = 2;

CREATE TABLE IF NOT EXISTS reseller_addressesaddress_id BIGINT(20)NOT NULL, reseller_id BIGINT(20)NOT NULL,PRIMARY KEY( reseller_idaddress_id ),KEY FK3F39FB15CB44906Freseller_id ),KEY FK3F39FB1541937EA5address_id ))ENGINE = InnoDB的默認字符集= UTF8 ;

ALTER TABLE reseller_addresses ADD CONSTRAINT FK3F39FB1541937EA5外鍵( address_id )參考addressid ),添加約束FK3F39FB15CB44906F外鍵( reseller_id )參考resellerid );

這是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

嘗試這種方式,您可以通過.build(...)將關聯傳遞給父類:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM