【问题标题】:Grails domain class Constraints vs Legacy DB constraintsGrails 域类约束与旧版数据库约束
【发布时间】:2014-06-12 16:28:53
【问题描述】:

我正在使用 grails GORM 进行数据库映射,并使用 oracle 作为数据库,该数据库已经填充了值。我的问题是,我是否可以在域类中定义一个新的约束,例如外键,即使它没有在我的遗留表的基础表中定义db?grails 应用程序仍然会接受约束对吗?约束不必与数据库的约束完全匹配吗?

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    您可以定义一个类的属性,这些属性不保存在数据库中,因此不需要在数据库中表示,这些属性定义如下:

    class Person {
      String name
      static transients = ['name']
    }
    

    查看有关transients 的信息。在 2.x 中,瞬态不会像文档 here 中列出的那样自动绑定,因此您必须明确地执行 bindable: true。

    【讨论】:

      【解决方案2】:

      是的,无论您的数据库中有什么,您在域类中定义的约束都将受到尊重。 2 真正相关的唯一时间是,如果您让 Hibernate 为您生成 DDL(大多数人不会为他们的生产环境执行此操作),在这种情况下,某些约束会影响生成的 DDL。由于您已经有一个数据库,因此您几乎可以肯定已将其关闭。

      编辑:

      影响 DDL 的约束示例是 size 约束。如果您使用size: 5..15 之类的内容约束字符串字段,默认情况下,生成的 DDL 将创建一个 15 个字符宽的列。如果您不允许应用生成 DDL,则在验证时仍会应用该约束,并且如果属性的字符数多于 15 个或少于 5 个,则验证将失败。一旦验证通过并将数据发送到数据库,框架就会假设那里一切正常。如果不是,则可能会引发相应的异常。例如,如果字符串有 12 个字符,它将在应用程序中通过验证并发送到数据库。如果数据库列只有 8 个字符宽,您将获得 SQLException。我希望这是有道理的。

      【讨论】:

        猜你喜欢
        • 2014-12-09
        • 2015-10-20
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-27
        相关资源
        最近更新 更多