Grails/Gorm의 레거시 매핑 : 1 개의 도메인 클래스와 1 : N- 릴레이션의 2 개의 테이블

StackOverflow https://stackoverflow.com/questions/639764

  •  11-07-2019
  •  | 
  •  

문제

두 개의 테이블이 있다고 가정 해 봅시다 직원 그리고 샐러리 1 : N 관계 (하나의 급여는 많은 직원과 관련 될 수 있음).

일반 SQL에서 테이블은 다음과 연결됩니다.

SELECT e.id, e.name, s.salary FROM employee e, salary s WHERE s.id = e.salary_id AND e.id = 12345;

다음 Gorm 기반 도메인 클래스를 가정하면 레거시 데이터베이스 구조를 클래스에 어떻게 매핑합니까?

class Employee {
   String name
   int salary
}

설명 #1 : 두 테이블의 데이터를 포함하는 하나의 도메인 클래스 만 원합니다. 따라서 다른 클래스를 추가하는 것은 옵션이 아닙니다.

설명 #2 : 제가 답을 찾으려고하는 질문은 단순히 "Grails/Gorm을 사용하여 두 테이블 두 테이블을 한 클래스에 어떻게 맵핑합니까?"입니다. 그렇게하는 것이 불가능하다고 믿는다면 질문을 다시 시도하기보다는 대답에 명확하게 말하십시오.

도움이 되었습니까?

해결책

IMO는 여러 테이블에 합류하여 하나의 도메인 클래스에 매핑하는 것이 일반적인 성배/고름으로는 불가능합니다. 해결 방법으로 레거시 XML 최대 절전 모드 매핑을 사용하고 활용할 수 있습니다. 기능에 가입하십시오 원하는 목표를 달성합니다. 물론 당신은 많은 gorm 케이크를 풀어 줄 것입니다.

다른 팁

SQL 예제는 직원과 급여의 두 개의 테이블이 있음을 나타냅니다. 이것은 또한 수업에 반영되어야합니다. 따라서 하나 대신 두 개의 클래스가 필요합니다. 그런 다음 Gorm 매핑은 다음과 같습니다.

class Employee {
   String name
   Salary salary
}

class Salary {
   static hasMany = [ employees : Employee ]
   int salary
}

보다 http://www.grails.org/gorm+-defining+ relationships

급여와 이름을 속성으로 사용하는 대신이 두 테이블에서 실제로 쿼리를 실행하는 방법을 얻을 수 있습니다.

물론, 그것은 성배의 길이 아니며, 성배 길을 따라갈 것을 강력히 권장합니다.

데이터베이스에 2 개의 테이블이있는 경우 다른 클래스를 추가 할 수 없다는 제한을 완전히 이해하지 못하지만 통합 인터페이스를 원한다면 방법을 급여 클래스에 위임하는 것이 작동합니까?

같은 것 :

class Salary {
    int amount
}

class Employee {
    Salary _salary
    String name

    String toString() { name }

    public Integer getSalary() {
        return _salary?.amount
    }
    public void setSalary(Integer amount) {
    // not quite sure of your business logic here, this is a guess
        _salary = Salary.findByAmount(amount)
        if (!_salary) {
            _salary = new Salary(amount: amount)
            _salary.save()
        }
    }
}


def e = new Employee(name:"willy loman", salary: 100)
e.save()
assert e.salary == 100

사용자 정의 최대 절전 모드 매핑 파일로 작업하기 위해 요구하는 것을 만들 수있을 수도 있지만, 그런 식으로 동면을 뒤집는 것에 대해 충분히 익숙하지 않습니다.

참조 이 페이지의 사용자 정의 사용자 유형 섹션.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top