嗨,这已经持续了几个月了,我已经失去了所有的希望。
我有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。
答案 0 :(得分:0)
现在设置方式,您的Components
课程只允许一种产品。因此,您拥有从Product
到Components
的一对多关系,这就是未创建联接表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)
在不相关的说明中,我建议您将域名类别设为单数,即Alternative
和Component
,以便遵循Grails'惯例和更有意义。