[英]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_addresses
( address_id
BIGINT(20)NOT NULL, reseller_id
BIGINT(20)NOT NULL,PRIMARY KEY( reseller_id
, address_id
),KEY FK3F39FB15CB44906F
( reseller_id
),KEY FK3F39FB1541937EA5
( address_id
))ENGINE = InnoDB的默認字符集= UTF8 ;
ALTER TABLE reseller_addresses
ADD CONSTRAINT FK3F39FB1541937EA5
外鍵( address_id
)參考address
( id
),添加約束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
嘗試這種方式,您可以通過.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.