当前位置: 首页 > 知识库问答 >
问题:

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

丘华翰
2023-03-14

使用Grails 2.2.4。和build-test-data:2.0.5。我在使用conf-bootstrap.groovy在DB中添加多对多实例时失败了。使用MySQL作为数据库。

以下是简化的域类:

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

}

而且

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

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

(下面是一个简单的ER图,因为我无法从MySQL工作台图中发布图像)

reseller==>1到many==>reseller_address<==many到1<==address

如果不存在address(idbigint(20)NOT NULL AUTO_INCREMENT,versionbigint(20)NOT NULL,address1varchar(255)NOT NULL,主键(id))则创建表(address))Engine=innoDB DEFAULT charset=utf8 AUTO_INCREMENT=1;

如果不存在reseller(idbigint(20)不为空AUTO_INCREMENT,versionbigint(20)不为空,reseller_namevarchar(255)不为空,主键(id))则创建表(id);

如果不存在则创建表reseller_address(address_idbigint(20)不为空,reseller_idbigint(20)不为空,主键(reseller_idaddress_id),键fk3f39fb15cb44906f(reseller_id),键

更改表reseller_address添加约束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中DB中的表为零。我可以看到它们被创建,然后它们在下面的错误处消失。

    | 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个答案

仲孙小云
2023-03-14

试试看,您可以通过.build(...)将您的关联传递给父类:

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

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

 类似资料:
  • 我正在创建minecraft插口插件,如何测试玩家是否为op? 例如在 我可以用。我没有得到许可。有这样的东西可以用来检查op吗?op有所有权限吗?

  • 问题内容: 我有一个Spring / Hibernate网络应用程序,该应用程序具有一些在内存中的HSQL数据库上运行的集成测试。由于hbm2ddl = create,Hibernate使用了这个空白数据库并创建了我的所有测试表和约束。但是,我有一个新的bean,在它的afterPropertiesSet()方法期间检查数据库中的特定配置值,因此,当初始化此bean时,数据库中必须存在这样的行。

  • 我的要求如下: > 我有几个.feature文件。我想创建所有这些特性文件通用的测试数据。一旦创建了测试数据,场景将从特性文件运行。 我还想要一些信息后,测试数据创建回来。例如,我创建的数据的ID。所以我可以使用这些信息来调用API,在我的场景中添加有效负载。 null 现在我已经在test-data-details.feature文件中拥有了测试数据对象。在包含测试场景的特性文件的后台部分,我将

  • 我编写了以下代码和驱动程序,但我不知道如何使用两个构造函数创建银行账户对象。一个构造函数获取初始余额,第二个构造函数在没有钱的情况下开设账户。此外,Account tBalance是否应该包括有效性检查? 或者,我可以执行以下操作: 将费用作为描述银行账户的一部分。根据需要更新BankAccount类。用户应该能够为每个帐户设置费用金额,并通过一种方法添加费用。向驱动程序添加代码以演示费用功能。(

  • 问题内容: 我有一个Spring / Hibernate网络应用程序,该应用程序具有一些在内存中的HSQL数据库上运行的集成测试。由于hbm2ddl = create,Hibernate使用了这个空白数据库并创建了我的所有测试表和约束。但是,我有一个新的bean,在它的afterPropertiesSet()方法期间检查数据库中的特定配置值,因此,当初始化此bean时,该行需要存在于数据库中。 有

  • 问题内容: 我正在尝试使用必须异步加载的配置为我的控制器创建摩卡测试。下面是我的代码。但是,运行mocha测试时,它不会运行任何测试,显示为。该s的甚至从来没有叫。我尝试在describe内执行操作,但是即使运行测试,也从未调用过。有没有一种方法可以在运行任何测试之前一次加载配置? 问题答案: 您应该使用选项运行Mocha ,然后在完成测试套件的构建后再使用。这是从您在问题中显示的代码派生的示例: