Grails 无法保存对象,会话中已存在? [复制]

Posted

技术标签:

【中文标题】Grails 无法保存对象,会话中已存在? [复制]【英文标题】:Grails fails to save object, already exists in session? [duplicate] 【发布时间】:2012-03-27 07:17:36 【问题描述】:

可能重复:Spring + Hibernate : a different object with the same identifier value was already associated with the session

我有三个域排列类似于下面的示例:

class Computer 
    static hasMany = [progStartTimes:ProgStartTime]
    static belongsTo = User

    static constraints = 
        name()
        operatingSystem()
        processor()
    

    User owner
    OperatingSystem os
    Processor processor


class OperatingSystem 
    static hasMany = [computers:Computer]

    static constraints = 
        name(blank:false,unique:'versionType',maxSize:80)
        versionType()
    

    static mapping = 
        versionType type:VersionTypeMapping
    

    String name
    VersionType versionType


class ProgStartTime implements Serializable 
    static constraints = 
        computer()
        program()
        duration()
    

    static mapping = 
        id composite:['computer','program']
        duration type:DurationMapping
    

    Computer computer
    Program program
    Duration duration

我有一个控制器,它创建一堆对象并将它们同时保存在一个事务中。保存大约五六个不同批次后它工作正常,但过了一会儿我得到了异常:

org.springframework.orm.hibernate3.HibernateSystemException: a different object
with the same identifier value was already associated with the session:
[diag.ProgStartTime#diag.ProgStartTime : null]; nested exception is
org.hibernate.NonUniqueObjectException: a different object with the same
identifier value was already associated with the session:
[diag.ProgStartTime#diag.ProgStartTime : null]

这是保存对象的控制器代码部分。有谁知道怎么回事?

ownerInstance.withTransaction  status ->
    try 
        if (operatingSystem.id == null) 
            operatingSystem.save()
        

        if (processor.id == null) 
            processor.save()
        

        startTimes.each 
            if (it.id == null) 
                it.save()
        
     catch (Exception e) 
        ownerInstance.errors.reject("Failed to save the necessary objects: " + e)
        status.setRollbackOnly()
    

【问题讨论】:

【参考方案1】:

ProgStartTime 的 id 映射是我在 Grails 中没有经常使用的东西,但是在查找之后,在我看来,通过使用该 composite id,你可以保证ProgStartTime 上的唯一性,没有两个人会同时共享计算机和程序。

如果您违反了该限制,我预计会看到与您所看到的错误类似的错误。根据 ProgStartTime 数据表中的内容检查您输入的数据类型,看看是否是问题所在。如果是其他事情,我会尽我所能提供进一步的帮助:)

出于好奇,您使用的是哪个版本的 grails?

【讨论】:

这是在 Grails 2.0.1 上。我现在正在验证数据。 可能应该只是等待。无论如何,我已经检查了数据并验证了没有重复或冲突。据我所知,这不应该发生,数据方面。它也只发生在某些数据上,而不是随机的,但我不知道这些数据有什么特别之处。 嗯,很有趣。您能否举例说明表中的一些数据,以及导致此错误的示例数据输入? 没有意义。 :-/ 实际 代码有更多字段和大量数据,出于简洁和就业目的,我不能在这里发布。有没有办法让 Grails 更详细地记录或详细说明异常的原因? 编辑:如果你想要一些示例数据,我可以发布一些。您更喜欢哪个域,还是各取一点? 哦,这可能不是一个简单的练习,然后会:/尝试检查这些链接,看看它们是否有帮助! ***.com/questions/4194350/…grails.1312388.n4.nabble.com/…

以上是关于Grails 无法保存对象,会话中已存在? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

无法附加分离的实体:“ObjectStateManager 中已存在具有相同键的对象”

ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。

ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象

ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象

ObjectStateManager 中已存在具有相同键的对象。 ObjectStateManager 无法跟踪具有相同键的多个对象

ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象