Grails未按预期设置数据库

时间:2014-08-27 15:38:35

标签: grails gorm

嗨,这已经持续了几个月了,我已经失去了所有的希望。

我有3个域名。

由组件组成的产品,每个组件都可以有替代产品。

以下是我的模特:

产品:

 class Product {
     String name
     String comments
     static hasMany = [components:Components]
 } 

组件:

 class Components {
    Product product
    static hasMany = [alternatives:Alternatives]
 }

备选方案:

class Alternatives {
    Product product
}

为了填充这个,我正在解析一个excel电子表格,这是执行它的代码:

Product st = new Product(
    name: row.getCell(0).getStringCellValue().toUpperCase(),
    comments: "test"
)
row.getCell(10).getStringCellValue().split("[|]").each {
    Product pro = Product.findByName(it.toUpperCase())
    if(pro) {
        Components c =  new Components(product: pro).save(flush:true)
        s.add(c)

        // Does not work
        //st.addToComponents(c)
    }
}
st.save(flush:true,failOnError:true)

这不会在数据库中创建名为product_components的表。这是我所期待的。 当我尝试使用addTo时,组件有一个与之关联的产品实例,然后将产品实例更改为我试图将其保存到的st产品实例。

我希望这是有道理的。

我发现它将组件域中的产品映射为产品域中的组件。

我现在假设在Product表中使用mapped by可能会修复它

static MappedBy = [components : //do something here ]

找到答案见下文:

我必须在我的产品域中添加以下内容。

  static mappedBy = {components joinTable: [name:'product_components',
                    column:'COMPONENTS_ID',
                    key: 'PRODUCT_ID']}

并在我的组件域中将产品名称更改为part_of。

1 个答案:

答案 0 :(得分:0)

现在设置方式,您的Components课程只允许一种产品。因此,您拥有从ProductComponents的一对多关系,这就是未创建联接表product_components的原因。

您还尝试将Components实例分配给多个产品:

// To the 'pro' Product
new Components(product: pro)

// To the 'st' Product
st.addToComponents(c)

但是,您的Components域类只允许一个Product,这就是为什么引用的Product被覆盖了。

如果您希望您的Components类有多个产品(这是您编写的代码正在尝试完成的代码),您必须将Product类添加到您的static hasMany阻止了Components

class Components {
    static hasMany = [alternatives: Alternatives, products: Product]
}

然后您可以执行以下操作:

def c = new Components().save(flush: true)
pro.addToComponents(c)
st.addToComponents(c)

在不相关的说明中,我建议您将域名类别设为单数,即AlternativeComponent,以便遵循Grails'惯例和更有意义。