2009-03-12 3 views
1

의 내가 두 테이블 직원과 1 급여 있다고 가정 해 봅시다 : N 관계를 (한 급여가 많은과 연관 될 수 있습니다 직원).레거시 매핑 : 하나 개의 도메인 클래스와 1 개의 테이블 : N-관계

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

내가 클래스에 기존의 데이터베이스 구조를 매핑 어떻게 다음 GORM 전원 도메인 클래스를 가정 :

일반 SQL에서 테이블과 조인 될 것이다?

class Employee { 
    String name 
    int salary 
} 

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

명확화 # 2 : 대답은 "Grails/GORM을 사용하여 하나의 클래스에 두 개의 테이블을 매핑하는 방법"입니다. 그렇게하는 것이 불가능하다고 생각되면 질문을 다시 말하기보다는 대답에 명확하게 기술하십시오.

+1

두 번째 클래스를 가질 수 없다는 것은 매우 이상한 요구 사항입니다. 일반적으로 다른 방법으로는 두 개의 테이블을 가질 수 없습니다. 이 요구 사항은 더 큰 문제의 증상 일 수 있으며이를 해결하면 모든 작은 문제를 모두 해결할 수 있습니다. 이유를 제시하는 것이 좋을 것입니다. – Chii

답변

2

IMO 일반 Grails/GORM에서는 여러 테이블을 결합하여 하나의 도메인 클래스에 매핑 할 수 없습니다. 이 문제를 해결하려면 기존 XML 하이버 네이트 매핑을 사용하고 join feature을 활용하여 원하는 목표를 달성 할 수 있습니다. 물론 GORM을 많이 잃어 버리게 될 것입니다.

0

SQL 예제는 Employee and Salary라는 두 개의 테이블이 있음을 나타냅니다. 이것은 또한 수업에 반영되어야합니다. 따라서 하나 대신에 두 개의 클래스가 필요합니다. GORM 매핑은 다음과 같이 보입니다. 당신이 통일 된 인터페이스를 가지고 찾고 있다면

class Employee { 
    String name 
    Salary salary 
} 

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

, 나는 완전히 데이터베이스의 두 테이블이있는 경우 다른 클래스를 추가 할 수없는에 대한 제한을 이해하지 못하는 http://www.grails.org/GORM+-+Defining+relationships

+0

답장을 보내 주셔서 감사합니다.하지만 다른 수업을 추가하는 것은 불가능합니다. 내 설명을 참조하십시오. – knorv

-1

볼 수 있지만, Salary 클래스에 메소드를 위임하는 것이 효과가 있습니까?

뭔가 같은 :

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 

그것은 당신이 매핑 파일을 최대 절전 모드 사용자 정의와 일을 요구하고 무엇을 할 수있을 가능성도 있습니다,하지만 난 그에서 최대 절전 모드 contorting에 충분히 익숙하지 해요 확실히 말할 수있는 방법.

Custom User Type section of this page을 참조하십시오.

0

속성으로 급여와 이름을 사용하는 대신 실제적으로이 두 테이블 모두에서 쿼리를 실행하는 get * 메서드를 사용할 수 있습니다.

부여 된 Grails 방식은 아닙니다. Grails 방식을 따르는 것이 좋습니다.

관련 문제