【问题标题】:Grails - a conditional mappingGrails - 条件映射
【发布时间】:2012-02-23 09:29:37
【问题描述】:

目前我正在开发一个使用 Oracle 作为数据库的 webapp。我已经被告知我的 webapp 也必须在 Sybase ASE 上运行。我的 Oracle 数据库使用序列来生成 ID,并且我映射了我的域类以使用这些序列。据我所知,Sybase ASE 没有序列,只有身份。这是我的问题。如何处理代码/配置以使用 Oracle 和 Sybase。每个域的 ID 的一些“条件映射”都可以。

我只是不想每次为已映射的其他数据库构建 webapp 时都在映射中注释/取消注释行。 有人知道该怎么做吗?

还有另一个危险:Oracle 和 Sybase 之间的另一个差异会影响映射(我不使用 dbCreate = "create" 生成数据库结构)。在这一点上,我什么都看不到。 有什么经验吗?


编辑: 事实证明,不可能为两个数据库制作一个映射。我的 Oracle 结构在列名和表名中使用引号。 Sybase ASE 中不允许使用引号。在某些特定平台上构建 webapp 时,我的(不是很好也很漂亮)解决方案正在更改(评论/取消评论)映射。

顺便说一句,我是 Grails 的忠实粉丝,而这种映射功能似乎是一个缺点。如果我使用“纯”Hibernate,我将在 xml 文件中有两个映射,我会根据底层数据库更改它们。但是 Grails 并没有给我提供两个映射的可能性。

【问题讨论】:

    标签: grails grails-orm grails-domain-class


    【解决方案1】:

    我不知道 grails 是否允许您为 id 生成配置代码映射,但我认为您可能不需要使用序列或身份,而是使用其他休眠 id 生成器策略:http://grails.org/doc/1.3.7/ref/Database%20Mapping/id.html

    编辑:

    查看休眠文档,我发现可以根据数据库的容量使用序列或标识,来自http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html#mapping-declaration-id

    所有生成器都实现该接口 org.hibernate.id.IdentifierGenerator。这是一个非常简单的界面。 一些应用程序可以选择提供自己专门的 然而,Hibernate 提供了一系列内置的 实施。内置生成器的快捷方式名称为 如下:

    ...

    原生

    根据能力选择身份、序列或hilo 底层数据库。

    所以你可能需要这样的配置:

    static mapping = {
        id generator:'native'
    }
    

    【讨论】:

    • 听起来不错!当我完成 Sybase 的安装后,我会尝试一下。
    • 不幸的是,我无法检查它是否有效。我相信它是但是......我的 Oracle id 名称被引用(如“SomeTableID”)。 Sybse ASE 不允许在列/表名称中使用引号。这就是我所害怕的。我不能为两个数据库使用一个映射。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2015-10-20
    相关资源
    最近更新 更多