2011-06-14 1 views
1

한 테이블의 기본 키가 다른 테이블의 외래 키인 경우 GORM에서 두 엔티티를 매핑하는 가장 좋은 방법은 무엇입니까? 예를 들어 :하나의 pk가 다른 pk를 참조 할 때 GORM에서 엔티티를 매핑하는 방법

CREATE TABLE `table_a` (
`a_id` int(11) NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (`a_id`) 
) 

그리고 다음 표에서 참조하는 'A_ID'이 테이블의 PK :

CREATE TABLE `table_b` (
`b_id` int(11) NOT NULL AUTO_INCREMENT, 
PRIMARY KEY (`b_id`), 
KEY `b_id_fk` (`b_id`), 
CONSTRAINT `b_id_fk` FOREIGN KEY (`b_id`) REFERENCES `table_a' (`a_id`) 
) 

나는 위의 두 개체를 매핑하려면 어떻게 여기

하나 개의 테이블 Grails/GORM에서? 다음 코드는 GORM이 '엔티티에 대한 매핑에서 반복되는 열'이라는 예외를 던지기 때문에 분명히 작동하지 않습니다.

class TableB { 

TableA tableA 
static belongsTo = [TableA] 

static mapping = { 
    id column:"b_id" 
    version false 
    tableA column:"b_id" 
} 

static constraints = { 
    tableA unique: true 
} 
} 

참고 :이 문제가 최근에 수정 된 문제 인 경우 grails 1.3.7을 사용하고 있지만 최신 버전으로 전환 할 수 있습니다. 저에게 알려주세요.

+0

스키마를 변경하거나 기본 키를 fk로 할 수 있습니까? – hvgotcodes

+0

스키마가 모범 사례에 따르지 않는다는 것을 알고 있습니다. 하지만 내가 바꿀 수없는 레거시 데이터베이스입니다. – sul

답변

2

귀하의 경우에 해당되는지는 잘 모르겠지만 한 가지해야할 것은 의 하위 클래스로 테이블 을 테이블 당 하위 클래스 상속 전략을 사용하여 매핑하는 것입니다. Grails 가이드에서 Inheritance Strategies을 확인하십시오.

그래서, 당신은 할 것 :

class TableA { 
    static mapping = { 
     id column: 'a_id' 
     table 'table_a' 
     version false 
     tablePerHierarchy false 
    } 
} 

class TableB extends TableA { 
    static mapping = { 
     id column: 'b_id' 
     table 'table_b' 
     version false 
    } 
} 

이 방법의 문제는 당신이 TableA 객체를 생성 한 후이 TableB 개체를 만들 수 있다는 것입니다. 당신이 새로운 TableA 인스턴스를 생성 할 때 Hibernate가 작동하는 방식으로, table_a에 레코드가 생성됩니다. 새 TableB 인스턴스를 만들면 table_a의 레코드와 table_b의 레코드가 동일한 ID로 만들어집니다.

OTOH, 나는이 같은 클래스 계층 구조의 매핑 이외의 스키마에 대한 유효한 이유를 생각할 수 없습니다.

+0

네가 맞다. 이것은 table-per-subclass 상속 전략을 사용하고있다. tablePerHierarchy 플래그를 false로 설정하면 예상대로 작동하는지 테스트했습니다. 당신의 도움을 주셔서 감사합니다! – sul