【问题标题】:How can I share domain between projects with different persistence strategies in grails?如何在 Grails 中使用不同持久性策略的项目之间共享域?
【发布时间】:2013-06-07 16:35:27
【问题描述】:

我是 Grails 的新手,在三个不同的应用程序之间共享我的域模型时遇到了一些问题。其中两个需要持久化模型对象,第三个不需要。

似乎通常的管理方法是创建一个插件并将域类放入其中。问题在于域类包含特定的持久性信息,并且每个应用程序持久化对象的方式存在一些差异。 此外,其中一个应用程序根本不需要保留这些对象,因为它使用来自另一个应用程序的 JSON Web 界面检索和删除它们。当我在 dbCreate = "create-drop" 模式下运行此应用程序时,Grails 会在启动时为这些类创建不需要的表。

我认为所有问题都来自于在域类中混合模型和持久性特定信息。 我该如何解决?有没有更好的方法来共享域模型?

【问题讨论】:

  • 就个人而言,我认为您必须解释为什么不同的应用程序需要以不同的方式持久化对象。此外,如果您是从 JSON Web 服务创建它们,模型是否也不存在(第 4 位)?请用实际例子说明情况。
  • 两个应用程序之间的持久性差异是微妙的。某些应用程序可能希望使用延迟检索或在父表中嵌入类。原因是其中一个将充当另一个应用程序中对象的缓存。这些差异尚未定义,但目标是允许它们具有独立的配置。
  • 域对象将用于两个应用程序中的持久性以及作为 JSON 的序列化/反序列化。后者是最成问题的情况,因为如果我别无选择,我可以使用相同的持久性配置,但我不希望在不需要持久性的应用程序中创建不必要的表(或持久性暗示的任何开销) .
  • 我不确定为什么会有任何东西会创建不必要的表。任何处于“生产”状态的 Grails 应用程序都应该使用数据库迁移。 dbCreate 设置仅用于开发。

标签: grails persistence grails-plugin


【解决方案1】:

您的方法是正确的,因为有一个包含所有域类的插件。这种方法适用于对 dataSource 进行多重配置,而不是操纵插件的行为。为了达到同样的效果,您可以相应地修改每个应用程序中的数据源。例如,如下所示:

//Application 1:
//DataSource.groovy
dataSource{
    environments{
        production{
            .........
            dbCreate = "update"
            url = "prod db url"
            ..........
        }
    }
}

//Application 2: [Similar to Application 1]
//DataSource.groovy
dataSource{
    environments{
        production{
            .........
            dbCreate = "update"
            url = "prod db url"
            ..........
        }
    }
}

//Application 3: [which does not persist model to db]
//DataSource.groovy
dataSource{
    environments{
        production{
            .........
            //anything other than update, create-drop, validate does nothing
            //Taking into consideration you already have the tables created from 
            //any of the other application.
            dbCreate = "none"
            url = "prod db url"
            readOnly = true //To be on the safer side
            ..........
        }
    }
}

相同的行为适用于其他环境。请参阅DataSource 以了解有关其属性的更多信息。

如果您已经有了这些表并想为这些表生成域类,您可以毫不费力地使用db-reverse-engineer 插件。

不过,如果您需要从应用程序 3 使用其他连接,则可以使用多个数据源。

【讨论】:

  • 第三个应用程序不持久化这个模型的对象,但它确实持久化了其他对象。它是一个前端应用程序,因此,它会保留会话和一些与活动相关的信息。
  • 正如我在问题下面评论的那样,两个应用程序之间的持久性差异在于延迟检索或嵌入式类。这种东西是在类声明中指定的,所以它们本质上是共享的。
  • 那么在这种情况下,您无法通过单个插件实现这一目标。它就像一个 Grails 插件,在不同的应用程序中使用时表现不同。我可能不得不改变我的答案。
  • 此外,我已经更新了使用多个数据源的答案,以防您希望应用程序 3 在不同的持久层中持久保存其他模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多