2012-03-09 1 views
0

가능한 중복 :
Spring + Hibernate : a different object with the same identifier value was already associated with the sessionGrails가 개체를 저장하지 못했습니다. 이미 세션에 있습니까?

나는 세 가지 도메인은 아래의 예와 유사하게 배열 한 :

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() 
    } 
} 

답변

2

ProgStartTime에 대한 귀하의 ID 매핑 내가 Grails는 자주 사용 보이지 않는 무언가이지만, 그것을보고 후 수행하여 복합 ID, 당신은 고유성을 보장을하고 있다는 것을 나에게 보인다 ProgStartTime에서 두 사람이 컴퓨터와 프로그램을 공유하지 않을 것입니다.

해당 제약 조건을 위반하는 경우보고있는 것과 같은 오류가 발생할 것으로 예상됩니다. ProgStartTime 데이터 테이블에 어떤 데이터가 입력되어 있는지 확인하여 문제가 있는지 확인하십시오. 다른 것 인 경우 더 도와 줄 수 있도록 최선을 다할 것입니다.

호기심에서 벗어나서 어떤 grails 버전을 사용하고 있습니까?

+0

이것은 Grails 2.0.1에 있습니다. 지금 데이터를 확인하는 중입니다. – Jesse

+0

방금 ​​기다려야 할 것 같습니다. 어쨌든 데이터를 검토 한 결과 중복이나 충돌이 없는지 확인했습니다. 내가 알 수있는 한, 이것은 데이터 발생하지 않아야합니다. 또한 임의의 데이터가 아닌 특정 데이터에서만 발생하지만 데이터에 대해 특별한 점을 알 수는 없습니다. – Jesse

+0

흠, 흥미 롭습니다. 테이블에있는 일부 데이터의 예와이 오류의 원인이되는 예제 데이터 입력을 제공 할 수 있습니까? –