2011-03-24 7 views
0

Grails를 사용하고 있으며 단방향 다 대다 관계가 필요합니다.Grails는 같은 테이블에서 다 대다 관계를 사용합니다.

내 애플리케이션에서 직원은 다른 직원을 신속하게 메모에 남기 위해 다른 직원을 "북마크"할 수 있습니다. 직원들은 누가 북마크에 추가했는지 알 필요가 없습니다.

즉, 본질적으로 이것을 사용할 수있는 employee.bookmarks 속성이 있어야합니다.

지금까지 Grails ORM에 대해 documentation on many-to-many relationships을 찾았습니다.하지만 이것은 두 개의 서로 다른 테이블에만있는 것으로 보입니다.

답변

6

는 소리

class Employee { 

    String name 
    static transients = ["bookmarks"] 

    def getBookmarks() { 
     Bookmark.findAllByBookmarker(this, [sort: "id", order: "asc"]) 
    } 
    ... 
} 

class Bookmark implements Serializable { 

    Employee bookmarker // the employee who bookmark someone 
    Employee bookmarkee // the employee who is bookmarked 

    static mapping = { 
    table "Bookmark" 
    id composite: ['bookmarker', 'bookmarkee'] 
    bookmarker(column: "BOOKMARKER_ID") 
    bookmarkee(column: "BOOKMARKEE_ID") 
    version false 
    } 

    static Bookmarker get(long bookmarkerId, long bookmarkeeId) { 
     find 'from Bookmark where bookmarker.id=:bookmarkerId and bookmarkee.id=:bookmarkeeId', 
      [bookmarkerId: bookmarkerId, bookmarkeeId: bookmarkeeId] 
    } 
    ... 
} 

이 방법은 테이블을 사용 직원 간 관계를 저장하기 위해 "책갈피"를 사용하므로 2 명의 직원이 동일한 직원을 북마크 할 수 있습니다. Bookmark 클래스는 Serializable을 구현해야합니다.

+0

이렇게하면 여러 명의 직원이 같은 직원을 북마크 할 수 있습니까? 즉, 'employeeA'와 'employeeB'는 모두 'employeeC'에 북마크되어 있습니다. –

+0

예 -이 모델은 관련 사용자를 저장하기 위해 조인 테이블을 생성하므로 여러 참조에 대한 제한이 없습니다. –

-1

당신이하고 싶은 말을 바탕으로 생각하고 싶은 것은 Employee.bookmarks를 사용하여 북마크중인 직원의 데이터베이스 ID를 저장하는 것입니다. 이렇게하면 목록 기능을 사용하여 직원 목록을 얻을 수 있습니까? 이것을 두 가지 수업으로하고 싶지 않은 이유가 있습니까? 이 작업을 수행 할

class Employee { 
    ... 
    static hasMany = [bookmarks: Employee] 
} 
0

당신은 transient properties를 사용할 수 있으며, 추가적인 테이블 "즐겨 찾기": 당신은 그냥 일반 단방향 1-많은이 필요한 것처럼

관련 문제