【问题标题】:Grails update referencesGrails 更新参考
【发布时间】:2012-01-13 14:40:41
【问题描述】:

如何将对象添加到关系并保持它?

如果我这样做

registrationInstance.addToActionType(id:id)

我得到一个异常

Unique index or primary key violation: "PRIMARY_KEY_E7 ON PUBLIC.ACTION_TYPE_REGISTRATIONS(ACTION_TYPE_ID, REGISTRATION_ID)"; SQL statement: insert into action_type_registrations (action_type_id, registration_id) values (?, ?) [23001-147]

编辑:

如果我写

registrationInstance.addToActionType(ActionType.get(id))

我得到了同样的错误,但它仍然存在 - 那么我怎样才能摆脱这个错误呢?

EDIT2:

如果我尝试移除一个对象:

registrationInstance.removeFromActionType(ActionType.get(id))

我收到以下错误(有时,并非总是如此)

Eindeutiger Index oder Primarschlüssel verletzt: "PRIMARY_KEY_E7 ON PUBLIC.ACTION_TYPE_REGISTRATIONS(ACTION_TYPE_ID, REGISTRATION_ID)" Unique index or primary key violation: "PRIMARY_KEY_E7 ON PUBLIC.ACTION_TYPE_REGISTRATIONS(ACTION_TYPE_ID, REGISTRATION_ID)"; SQL statement: update action_type_registrations set action_type_id=? where registration_id=? and action_type_idx=? [23001-147]

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

    您必须将对象本身添加到关系中:

    registrationInstance.addToActionType(ActionType.load(id))
    registrationInstance.save()
    

    【讨论】:

    • 我会改用ActionType.load(id);它不会从数据库中检索实例,而只是创建一个代理。由于您只设置外键,因此比加载它并丢弃它要便宜得多。
    【解决方案2】:

    它似乎没有检测到该实例已经在集合中。为ActionType 实现合理的hashCode 和equals 方法,以便Hibernate 可以检测到它已经存在,而不会尝试在ACTION_TYPE_REGISTRATIONS 连接表中创建重复记录。

    【讨论】:

      猜你喜欢
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      相关资源
      最近更新 更多