Домен Grails Создать Таблицу Ассоциации - PullRequest
1 голос
/ 04 августа 2011

У меня есть вопрос о создании ассоциативной таблицы в граалях для согласования отношений «многие ко многим».Настройка такова: 1. Домен A (профиль клиента) может иметь много доменов B (Друзья) 2. Каждый домен B (Друзья) может иметь много доменов A (Профиль клиента) 3. Чтобы решить эту проблему, мне нужно создать ассоциативнуютаблица (или домен), которая имеет FK из каждой таблицы.Этот домен может быть назван Домен C (client_friend)

Вот код, который у меня есть на данный момент:

class DomainA{
    String id
String firstName
String lastName
    static hasMany = [domainB: DomainB]
    static mapping = {
    cache true
    id generator: 'assigned'

    columns {
        firstName   type:'text'
        lastName    type:'text'
        alumConnections column: 'domaina_id', joinTable: 'a_b'
    }

}
static constraints = {
    firstName   (nullable:true)
    lastName    (nullable:true)
}

  }

Код доменаB:

   class DomainB{   
String id
String firstName
String lastName

    static hasMany = [domainA:DomainA]
static belongsTo = DomainA
static mapping = {
    cache true
    id generator: 'assigned'        

             columns {                  
        firstName       type:'text'
        lastName        type:'text'
        domainA column: 'domainb_id', joinTable: 'a_b'
    }
}
static constraints = {  
    firstName       (nullable:true)
    lastName        (nullable:true)

}
  }

Код домена A_B:

 class AB{


Date dateCreated
Date lastUpdated
long version

  }

Когда я запускаю этот код, кажется, он работает.Таблицы, использующие MySQL, созданы, кажется, FK на месте.Когда я ввожу данные в класс DomainB, вводятся данные, и оба файла из DomainA и DomainB вставляются в A_B.Но проблема возникает, когда я пытаюсь удалить значения из A_B.Я пробовал что-то вроде этого:

     AB results =AB.findByAIdAndBId('jIi-hRi4cI','2BYvuA2X14') 

, но получаю ошибку: InvalidPropertyException: не найдено свойство для имени [a_id] для класса [class mgr.AB]

Мой вопрос такой: во-первых, я правильно настроил?Во-вторых, если да, то как мне тогда запросить таблицу AB, которая состоит из композита DomainA и DomainB?

Спасибо за любую помощь.

jason

1 Ответ

1 голос
/ 05 августа 2011

Ваш составной класс не совсем корректен.Посмотрите на этот пример и скорректируйте свой соответственно.Вот как я делаю все свои составные домены:

class UserRole implements Serializable {

    User user
    Role role

    boolean equals(other) {
        if (!(other instanceof UserRole)) {
            return false
        }

        other.user?.id == user?.id &&
            other.role?.id == role?.id
    }

    int hashCode() {
        def builder = new HashCodeBuilder()
        if (user) builder.append(user.id)
        if (role) builder.append(role.id)
        builder.toHashCode()
    }

    static UserRole get(long userId, long roleId) {
        find 'from UserRole where user.id=:userId and role.id=:roleId',
            [userId: userId, roleId: roleId]
    }

    static UserRole create(User user, Role role, boolean flush = false) {
        new UserRole(user: user, role: role).save(flush: flush, insert: true)
    }

    static boolean remove(User user, Role role, boolean flush = false) {
        UserRole instance = UserRole.findByUserAndRole(user, role)
        instance ? instance.delete(flush: flush) : false
    }

    static void removeAll(User user) {
        executeUpdate 'DELETE FROM UserRole WHERE user=:user', [user: user]
    }

    static void removeAll(Role role) {
        executeUpdate 'DELETE FROM UserRole WHERE role=:role', [role: role]
    }

    static mapping = {
        id composite: ['role', 'user']
        version false
    }
}

Как только вы это сделаете, вам не нужно будет связывать принадлежащие с hasMany ассоциации.Но для доступа к данным из этих доменов вы можете предоставить методы, подобные следующим:

class User {

   // typical domain junk

   Set<Role> getAuthorities() {
     UserRole.findAllByUser(this).collect { it.role } as Set
   }
}

Затем вы можете делать такие вещи, как userInstance.authorites, как если бы там было hasMany.По сути, вы делаете то, что обычно делает Grails для вас.Но это на самом деле хорошая вещь.Коллекции в Grails могут быть дорогостоящими, если не все сделано правильно.Это решается в 2.0 с использованием Bags.

...