【问题标题】:Grails Constraints with Java Classes and Hibernate Mappings带有 Java 类和 Hibernate 映射的 Grails 约束
【发布时间】:2012-02-12 19:27:35
【问题描述】:

我在 src/java 中定义了以下 Java 类

package org.davisworld.trip;

public class AirportHbm {
  private long id;
  private String name;
  private String iata;
  private String state;
  private String lat;
  private String lng;

  // getters/setters defined
}

我在 conf/hibernate 中有如下定义的 hbm.cfg.xml 文件:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <mapping resource="AirportHbm.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

我在 conf/hibernate 中配置了 AirportHbm.hbm.xml 文件,如下所示:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="org.davisworld.trip.AirportHbm" table="usgs_airports">
        <id name="id" column="airport_id">
            <generator class="native"/>
         </id>          
        <property name="name" type="java.lang.String">
            <column name="airport_name" not-null="true" />
        </property>
        <property name="iata" type="java.lang.String">
            <column name="locid" not-null="true" />
        </property>
        <property name="state" />
        <property name="lat" column="latitude" />
        <property name="lng" column="longitude" />
    </class>
</hibernate-mapping>

最后,我在 src/java 文件夹中有一个 AirportHbmConstraints.groovy 文件:

package org.davisworld.trip

class AirportHbmConstraints {
    static constraints = {
        name()
        iata(maxSize:3)
        state(maxSize:2)
        lat()
        lng()
    }
}

当我尝试运行应用程序时,在 Spring 初始化 Web 应用程序上下文时出现此错误:

Caused by: java.lang.ClassCastException: org.davisworld.trip.AirportHbmConstraints cannot be cast to groovy.lang.Script

我遵循的教程最初说 AirportHbmConstraints.groovy 文件不应该有一个类;它应该只是一个脚本:

package org.davisworld.trip


static constraints = {
        name()
        iata(maxSize:3)
        state(maxSize:2)
        lat()
        lng()
}

但是当我这样做时,STS 会给我一个编译器错误:

Groovy:此处不允许使用修饰符“静态”。

有人知道我做错了什么吗?将 Groovy 中的约束应用于 Java 域类的正确方法是什么?

非常感谢, 维托

【问题讨论】:

    标签: grails grails-domain-class grails-constraints


    【解决方案1】:

    当使用带有 Hibernate 域的约束脚本时,不要使用 class 声明或 static 修饰符,如 Grails 文档的 15.3 Adding Constraints 部分所述。

    正确的约束脚本应该是:

    constraints = {
        iata maxSize: 3
        state maxSize: 2
    }
    

    请注意,没有约束的字段和字段声明上的括号是可选的。

    【讨论】:

    • 解决了!非常感谢@JamesA
    • 附注感谢您指出 Hibernate 文档。我看过那里,但显然不够努力。
    猜你喜欢
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    相关资源
    最近更新 更多