[Grails] GORM의 액션(프로그램 HasMany 편)

14386 단어 Grails

의 목적


그레이스의 GORM은 매우 강하지만, 동작이 문서만 읽는 것이라면 이해하기 어렵다.
그래서 이번에 우리는 HasMany의 레벨링이 기본 상태에서 어떻게 작동하는지 검증했다.

샘플 출처


다음 두 도메인을 준비합니다.
내용은 Person이 여러 Hobby를 유지하는 것이다.
누구든지 다양한 취미가 있다.
Person.groovy
class Person {

    String name
    Date dateCreated
    Date lastUpdated
    static hasMany = [hobbies:Hobby]
    static constraints = {
    }
}
Hobby.groovy
class Hobby {

    String name
    Date dateCreated
    Date lastUpdated
    static constraints = {
    }
}
또한 생성된 표는 다음과 같다.

안은 당연히 비어있죠.

다음 리모컨을 준비하고 각자 확인표 내용을 방문한다.
HelloController.groovy
class HelloController {

    // 初期データの登録
    def index() {
        def p = new Person(name:"koji").save()
        def h = new Hobby(name:"computer").save()
        render("index ok")
    }

    // PersonインスタンスにHobbyインスタンスを追加する。
    def index2() {
        def p = Person.findByName("koji")
        def h = Hobby.findByName("computer")
        p.addToHobbies(h)
        p.save()
        render("index2 ok")
    }

    // Hobbyインスタンスを持つPersonインスタンスの更新(Hobbyの値は変更しない)
    def index3(){
        def p = Person.findByName("koji")
        def h = Hobby.findByName("computer")
        p.name +="!!"
        p.save()
        render("index3 ok")
    }

    // HobbyインスタンスをもつPersonインスタンスの更新(Hobbyの値を変更する)
    def index4() {
        def p = Person.findByName("koji!!")
        p.hobbies.each { it.name += "_upated" }
        p.save()
        render("index4 ok")
    }

    // Hobbyインスタンスを持つPersonインスタンスの削除
    def index5() {
        def p = Person.findByName("koji!!")
        p.delete()
        render("index5 ok")
    }
}

실제 작업 액세스 및 확인


index 동작


데이터를 따로 저장할 수밖에 없다.
def index() {
    def p = new Person(name:"koji").save()
    def h = new Hobby(name:"computer").save()
    render("index ok")
}
DB는 다음과 같습니다.

index2 동작

// PersonインスタンスにHobbyインスタンスを追加する。
def index2() {
    def p = Person.findByName("koji")
    def h = Hobby.findByName("computer")
    p.addToHobbies(h)
    p.save()
    render("index2 ok")
}
DB는 다음과 같습니다.

PERSON_HOBBY 테이블과 연관된 레코드가 INSERT임을 나타냅니다.
또 퍼슨이 허비를 추가했기 때문에 퍼슨의 해당 음반은 당연히 UPDATE에 수록된다.
그러나 Hobby 인스턴스 자체는 값이 변경되지 않으므로 UPDATE가 수행되지 않습니다.

index3 동작

// Hobbyインスタンスを持つPersonインスタンスの更新(Hobbyの値は変更しない)
def index3(){
    def p = Person.findByName("koji")
    def h = Hobby.findByName("computer")
    p.name +="!!"
    p.save()
    render("index3 ok")
}
DB는 다음과 같습니다.

이번엔 퍼슨이야.name의 값만 업데이트되었기 때문에 UPDATE의 시계도 당연히 개인 시계의 상응하는 기록만 있을 뿐이다.

index4 동작

// HobbyインスタンスをもつPersonインスタンスの更新(Hobbyの値を変更する)
def index4() {
    def p = Person.findByName("koji!!")
    p.hobbies.each { it.name += "_upated" }
    p.save()
    render("index4 ok")
}
DB는 다음과 같습니다.

코코아 소스.
확실히 Person이 가지고 있는 Hobby 실례의 값은 모두 변경되었지만, save 방법을 실행하는 것은 Person 실례만 있다.
하지만 Hobby의 값이 업데이트되었습니다.
Person의 업데이트는 Hobby에 의해 연결되었다고 한다.
또 퍼슨의 세이브 방법을 실행했지만 퍼슨의 기록 자체는 업데이트되지 않았다.
이를 통해 알 수 있듯이 Grails는 업데이트(UPDAATE) 시 값 자체에 변화가 없으면 실제 SQL(UPDATE)을 실행하지 않는다.
index3에서 Person의save 방법을 실행할 때 Person이 가지고 있는 Hobby 실례는 원래 업데이트 처리도 등급이 연결되었지만 Hobby의 값 자체가 변하지 않았기 때문에 결과적으로 UPDATE를 진행하지 않았다.

index5 동작

// Hobbyインスタンスを持つPersonインスタンスの削除
def index5() {
    def p = Person.findByName("koji!!")
    p.delete()
    render("index5 ok")
}
DB는 다음과 같습니다.

데이터가 PERSON 테이블과 PERSONHOBBY 테이블에서 제거합니다.
삭제에 대한 캐스케이드가 없습니다.
따라서 퍼슨이 보유한 허비와 관련된 데이터 자체는 DB에서 삭제되지 않는다.
삭제도 등급을 연결하려는 경우 다음과 같은 두 가지 방법이 있다.
1.Hobbystatic belongsTo = [person:Person]자격을 부여하다.
2. 다음 코드를 Person에 추가합니다.
static mapping = {
    hobbies cascade: "all-delete-orphan"
}
1번에 대해서는 똑똑하지만 원래 하스맨에 벨롱스토가 있으면 테이블 구성이 달라진다.(기본 자동 생성 시)
2번에 대해 개인 실례인 리모브 Hobby에서 리모브의 Hobby가 Person에서 삭제되고 이 Hobby 기록 자체도 데이터베이스에서 삭제된다.
1위 belongsto에 대해 이번 Hobby는 원래 이른바 주 데이터이기 때문에 Person 실례(belongsto)에 속한다는 점이 이상하다.
따라서, Hobby 실례를 가지고 있는 Person을 Hobby 영역에서 검색하는 목적에 사용해서는 안 된다고 생각합니다.

좋은 웹페이지 즐겨찾기