我有一个非常简单的hasMany关系,其中“product”有很多“包”。我正在运行一个脚本来尝试填写数据,这在第一次运行时工作正常。然而,在第二次运行时,它开始输入重复项,我虽然不能用于hasMany
package = Package.findBySourceId(packageId) ?: new Package(name:packageName, price:packagePrice, sourceId:packageId).save(flush:true)
product = Product.findBySourceId(productId)
product.addToPackages(package)
product.save(flush:true)
当我进行sql登录时,我可以看到有时候应该在addToPackages调用上运行的select不会运行。它只是选择查找产品,然后直接插入连接表。
我不想因为工作而添加确切的查询,但基本上就像
Select -> for the initial package which it finds
Select -> for product which it finds by the product id
Insert -> insert into the join table without even a select to check if an entry exists
然而,有时候不是那个插入,它会运行一个select并找到匹配,然后该过程将重新开始。不知道这里的grails背后的逻辑。请记住,我有一个运行脚本,用数千行来提取数据,这是一个会话问题吗?
答案 0 :(得分:3)
您是否在一对多的“多”方面使用了列表或集合?默认值为Set,应该限制重复。如果您使用List映射了集合,那么您可能已经创建了问题。
或者,验证标识属性“package”是否具有equals()和hashCode()的正确行为。
答案 1 :(得分:0)