Grails多对多关系关注点

Grails多对多关系关注点,grails,Grails,我有一个应用程序,其中所有者对象可以有许多帐户对象,帐户对象可以有许多所有者对象。我曾想过用多对多关系对此进行建模,但后来我意识到,我可能还需要创建帐户对象,其中所有者无法立即确定,或者可能在以后创建帐户后创建。因此,我不相信我可以使用Grails多对多关系(我认为)。所以,我只是在Owner类中有一个属性,它是帐户ID的列表(这将是所有者的帐户引用),在Account类中有一个属性,它是所有者ID的列表(这将是帐户的所有者引用)。还有更好的主意吗?我觉得这太过时了,类似于C++指针的方式。<

我有一个应用程序,其中所有者对象可以有许多帐户对象,帐户对象可以有许多所有者对象。我曾想过用多对多关系对此进行建模,但后来我意识到,我可能还需要创建帐户对象,其中所有者无法立即确定,或者可能在以后创建帐户后创建。因此,我不相信我可以使用Grails多对多关系(我认为)。所以,我只是在Owner类中有一个属性,它是帐户ID的列表(这将是所有者的帐户引用),在Account类中有一个属性,它是所有者ID的列表(这将是帐户的所有者引用)。还有更好的主意吗?我觉得这太过时了,类似于C++指针的方式。< /P> < p>你可以创建一个第三域来解决这个关系

class Owner{
    ...

    Set<Object> getObjects() {
        OwnerObject.findAllByOwner(this).collect { it.object } as Set // or replace with optimized criteria
    }
    ...
}

class Object{
    ...

    Set<Owner> getOwners() {
        OwnerObject.findAllByObject(this).collect { it.owner } as Set // or replace with optimized criteria
    }
    ...
}


class OwnerObject implements Serializable {

    Owner owner
    Object object

    boolean equals(other) {
        if (!(other instanceof OwnerObject)) {
            return false
        }
        other.owner?.id == owner?.id && other.object?.id == object?.id
    }

    static OwnerObject get(long ownerId, long objectId) {
        find 'from OwnerObject where owner.id=:ownerId and object.id=:objectId',
                [ownerId: ownerId, objectId: objectId]
    }

    static OwnerObject create(Owner owner, Object object, boolean flush = false) {
        new OwnerObject(owner: owner, object: object).save(flush: flush, insert: true)
    }

    static boolean remove(Owner owner, Object object, boolean flush = false) {
        OwnerObject instance = OwnerObject.findByOwnerAndObject(owner, object)
        if (!instance) {
            return false
        }
        instance.delete(flush: flush)
        true
    }

    static void removeAll(Owner owner) {
        executeUpdate 'DELETE FROM OwnerObject WHERE owner=:owner', [owner: owner]
    }

    static void removeAll(Object Object) {
        executeUpdate 'DELETE FROM OwnerObject WHERE object=:object', [object: object]
    }

    static mapping = {
        id composite: ['object', 'owner']
        version false
    }
}
类所有者{
...
设置getObjects(){
OwnerObject.findAllByOwner(this).collect{it.object}作为集合//或替换为优化条件
}
...
}
类对象{
...
Set getOwners(){
OwnerObject.findAllByObject(this).将{it.owner}收集为集合//或替换为优化条件
}
...
}
类OwnerObject实现可序列化{
业主
对象对象
布尔等于(其他){
如果(!(所有者对象的其他实例)){
返回错误
}
other.owner?.id==owner?.id&&other.object?.id==object?.id
}
静态OwnerObject获取(长ownerId、长objectId){
查找'from OwnerObject,其中owner.id=:ownerId和object.id=:objectId',
[ownerId:ownerId,objectId:objectId]
}
静态所有者对象创建(所有者,对象对象,布尔刷新=false){
新建所有者对象(所有者:所有者,对象:对象)。保存(刷新:刷新,插入:true)
}
静态布尔删除(所有者、对象对象、布尔刷新=false){
OwnerObject实例=OwnerObject.findByOwnerAndObject(所有者,对象)
如果(!实例){
返回错误
}
实例。删除(刷新:刷新)
真的
}
静态void removeAll(所有者){
executeUpdate'从所有者对象中删除,其中所有者=:所有者',[owner:owner]
}
静态void removeAll(对象){
executeUpdate'DeletefromOwnerObject,其中object=:object',[object:object]
}
静态映射={
id组合:[“对象”、“所有者”]
版本错误
}
}

坦白说,在我6年多的“Grails职业生涯”中,我只使用过一次m2m关系。相反,o2m和动态查询的组合更易于实现和维护,通常性能更高。

感谢您提供详细的解决方案Aamir saahib。“o2m”是什么意思?