【问题标题】:grails addTo entering duplicate data for hasMany relationshipgrails addTo 为 hasMany 关系输入重复数据
【发布时间】:2011-05-17 20:13:06
【问题描述】:

我有一个非常简单的 hasMany 关系,其中“产品”有很多“包”。我正在运行一个脚本来尝试填写数据,这在第一次运行时运行良好。但是在第二次运行时,它开始输入重复项,我认为这对于 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 -> 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

但是,有时它会运行选择并找到匹配项,而不是插入,然后该过程将重新开始。这里不知道 grails 背后的逻辑。请记住,我有一个正在运行的脚本正在提取数千行的数据,这是某种会话问题吗?

【问题讨论】:

  • 你的包类是什么样的?您是否在 sourceId 属性上设置了正确的约束?
  • 听起来您正在进行某种非确定性行为。哎呀...

标签: grails groovy has-many


【解决方案1】:

您是否在一对多的“多”方面为您的集合使用了列表或集合?默认是一个 Set,它应该限制重复。如果您使用列表映射集合,那么您可能已经创建了问题。

或者,验证身份属性“包”对于 equals() 和 hashCode() 的行为是否正确。

【讨论】:

  • 如何映射集合以使用列表而不是集合?
  • @MartinKlosi 只需在static hasMany = [myObjects: MyObject] 之前声明List myObjects。有关示例,请参见 stackoverflow.com/questions/520187/…
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多