문제

Grails 'bootstrap.groovy (또는 그 문제에 대해)에서 도메인 객체의 ID를 명시 적으로 설정할 수 있습니까?

다음을 시도했습니다.

new Foo(id: 1234, name: "My Foo").save()

그리고:

def foo = new Foo()
foo.id = 1234
foo.name = "My Foo"
foo.save()

그러나 두 경우 모두 결과를 인쇄 할 때 Foo.list() 런타임에, 나는 내 객체에 1의 ID 또는 순서의 다음 ID가 무엇이든 주어 졌음을 알 수 있습니다.

편집하다:이것은 Grails 1.0.3에 있으며, 내장 HSQL 데이터베이스와 함께 'Dev'에서 응용 프로그램을 실행할 때.

편집하다:Chanwit가 제공했습니다 아래의 좋은 솔루션 중 하나입니다. 그러나 실제로 도메인의 ID 생성 메소드를 변경하지 않고 ID를 설정하는 방법을 찾고있었습니다. 이것은 주로 테스트를위한 것입니다. 테스트 부트 스트랩 또는 setUp(), 그러나 여전히 auto_increment 또는 생산 시퀀스를 사용할 수 있습니다.

도움이 되었습니까?

해결책

예, 수동으로 Gorm 매핑 :

class Foo {
  String name
  static mapping = {
    id generator:'assigned'
  }
}

그리고 두 번째 스 니펫 (첫 번째 스 니펫이 아님)은 작업을 수행합니다 (생성자를 통과 할 때 ID는 할당되지 않음).

다른 팁

해결 방법으로 사용한 것은 ID로 개체를 시도하고 검색하지 않는 것이 었습니다. 따라서 질문에 주어진 예를 위해 도메인 객체를 변경했습니다.

class Foo {
  short code /* new field */
  String name

  static constraints = {
    code(unique: true)
    name()
  }
}

그런 다음 An을 사용했습니다 enum 코드에 대한 가능한 모든 값 (정적)을 보유하고 검색합니다. Foo a Foo.findByCode() 사용하는 대신 적절한 열거 값으로 Foo.get() 내가 이전에하고 싶었던 것과 같은 신분증으로).

가장 우아한 솔루션은 아니지만 저에게 효과적이었습니다.

대안으로 데이터를 가져오고 있다고 가정합니다 또는 기존 앱에서 데이터를 마이그레이션합니다, 테스트 목적으로 부트 스트랩 파일 내에서 로컬 맵을 사용할 수 있습니다. 혜택이있는 import.sql처럼 생각하십시오 ;-)

이 접근법 사용 :

  1. 테스트를 위해 도메인 제약 조건을 변경할 필요가 없습니다.
  2. 기존 데이터에서 테스트 된 마이그레이션 경로가 있으며
  3. 향후 통합 테스트를위한 좋은 데이터 슬라이스 (또는 전체 슬라이스)가 있습니다.

건배!

def init = { servletContext ->

    addFoos()
    addBars()

}

def foosByImportId = [:]
private addFoos(){
    def pattern = ~/.*\{FooID=(.*), FooCode=(.*), FooName=(.*)}/
    new File("import/Foos.txt").eachLine {
        def matcher = pattern.matcher(it)
        if (!matcher.matches()){
            return;
        }

        String fooId = StringUtils.trimToNull(matcher.group(1))
        String fooCode = StringUtils.trimToNull(matcher.group(2))
        String fooName = StringUtils.trimToNull(matcher.group(3))

        def foo = Foo.findByFooName(fooName) ?: new Foo(fooCode:fooCode,fooName:fooName).save(faileOnError:true)
        foosByImportId.putAt(Long.valueOf(fooId), foo) // ids could differ
    }
}

private addBars(){
    ...
    String fooId = StringUtils.trimToNull(matcher.group(5))
    def foo = foosByImportId[Long.valueOf(fooId)]
    ...
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top