【问题标题】:Grails many to many relationship concernGrails 多对多关系问题
【发布时间】:2014-07-04 18:22:38
【问题描述】:

我有一个应用程序,其中 Owner 对象可以有很多 Account 对象,Account 对象可以有很多 Owner 对象。我想用多对多关系对此进行建模,但后来我意识到我可能还需要创建无法立即确定所有者的帐户对象,或者可能在帐户已经创建后在将来创建。因此,我不相信我可以使用 Grails 多对多关系(我认为)。所以,我只想在 Owner 类中有一个属性,它是 Account ids 列表(这将是 Owner 的 Accounts 引用)和 Account 类中的一个属性,它是 Owner ids 列表(这将是 Account 的业主参考)。有更好的想法吗?我觉得这太老套了,类似于 C++ 指针的做法。

【问题讨论】:

    标签: grails


    【解决方案1】:

    您可以创建第三个域来解决这样的关系

    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
        }
    }
    

    【讨论】:

    • 感谢Aamir saahib的详细解决方案。
    【解决方案2】:

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

    【讨论】:

    • “o2m”是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2021-09-14
    • 2015-07-09
    • 2014-11-11
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多