【问题标题】:Grails inheritance MongoDb collection per child class每个子类的 Grails 继承 MongoDb 集合
【发布时间】:2014-08-16 01:24:47
【问题描述】:

在我使用 mongoDb 和继承的 Grails 2.3.8 应用程序中,我有这个基础域类:

class Record {
long batchID
static mapping = { tablePerHierarchy false }
}

还有这个子类:

class IndividualRecord extends Record {
    String uniqueId
    String firstName
    String middleName

    static mapping = {
        collection "individualRecords"
        database "twcdb"
    }

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

}

问题是我希望我的子类映射到他们自己的 mongoDb 集合,但即使使用上面的配置,我的 IndividualRecord 对象也被保存在一个名为“record”的集合中,这是基类的名称。我错过了什么?有趣的是,无论我是否从子类中删除此代码,这种行为似乎都不会改变:

static mapping = {
        collection "individualRecords"
        database "twcdb"
    }

【问题讨论】:

    标签: mongodb grails


    【解决方案1】:

    MongoDB 插件目前不支持 tablePerHierarchy 设置继承,原因如下:

    a) MongoDB 不支持连接,因此要获取所有数据,您需要执行多个查询,而这会导致性能不佳

    b) 即使它确实支持tablePerHierarchy MongoDB 没有表,它也不会被称为。

    【讨论】:

    • 感谢您的回复。我只是认为,如果我的子记录在每个集合的基础上分开,这可能有助于搜索时间,这样我就可以拥有多个中型集合而不是一个大型集合。
    【解决方案2】:

    使用聚合而不是继承:

    class IndividualRecord {
    
     Record base
    
     static embedded = [ 'base' ]
    
    }
    

    【讨论】:

    • 这会导致每个子类的单独集合吗?
    • 是的,因为不会有父类或子类>)
    【解决方案3】:

    使用 AbstractPersistanceListner 处理持久性事件。这是代码示例并在 bootstrap.groovy 中注册此侦听器。完整代码http://jagadeeshmanne.blogspot.in/2016/06/custom-persistence-listener-in-mongodb.html。您可以通过检查 entityObject.class.name.equals(IndividualRecord.class.name) 来分配属性值,然后分配 batchID 值

    import org.grails.datastore.mapping.core.Datastore
    import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent
    import org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener
    import org.grails.datastore.mapping.engine.event.PreDeleteEvent
    import org.springframework.context.ApplicationEvent
    
    import org.grails.datastore.mapping.engine.event.EventType
    
    class MongoPersistanceListener extends AbstractPersistenceEventListener  {
    
        def springSecurityService
    
        public MongoPersistanceListener(final Datastore datastore, def springSecurityService) {
            super(datastore)
            this.springSecurityService = springSecurityService
        }
        @Override
        protected void onPersistenceEvent(final AbstractPersistenceEvent event) {
            def entity = event.entityObject
            switch(event.eventType) {
                case EventType.PreInsert:
                    initDefaults(entity)
                    break
                case EventType.PostInsert:
                    break
                case EventType.PreUpdate:
                    def currentUser = springSecurityService.getCurrentUser()
                    event.entityObject.updatedBy = currentUser ? currentUser.id : 0;
                    event.entityObject.updatedOn = new Date();
                    break;
                case EventType.PostUpdate:
                    break;
                case PreDeleteEvent:
                    break;
                case EventType.PostDelete:
                    break;
                case EventType.PreLoad:
                    break;
                case EventType.PostLoad:
                    break;
                case EventType.Validation:
                    initDefaults(entity)
                    break;
            }
        }
    
        @Override
        public boolean supportsEventType(Class<!--? extends ApplicationEvent--> eventType) {
            return true
        }
    
        void initDefaults(entity) {
            def currentUser = springSecurityService.getCurrentUser()
            if (entity.createdBy == null) {
                entity.createdBy = currentUser? currentUser.id : 0;
            }
            if (entity.createdOn == null) {
                entity.createdOn = new Date();
            }
            if (entity.updatedBy == null) {
                entity.updatedBy = currentUser? currentUser.id : 0;
            }
            if (entity.updatedOn == null) {
                entity.updatedOn = new Date();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-09
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多