Ограничения Grails с помощью классов Java и отображений Hibernate

У меня есть следующий класс Java, определенный в src/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
}

У меня есть файл hbm.cfg.xml, определенный в conf/hibernate следующим образом:

<?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>

У меня есть файл AirportHbm.hbm.xml, настроенный в conf/hibernate следующим образом:

<?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>

И, наконец, у меня есть файл AirportHbmConstraints.groovy в папке src/java:

package org.davisworld.trip

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

Когда я пытаюсь запустить приложение, я получаю эту ошибку, когда Spring инициализирует контекст веб-приложения:

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: Модификатор "static" здесь не разрешен.

Кто-нибудь знает, что я делаю не так? Как правильно применить ограничения в Groovy к классу домена Java?

Большое спасибо, Вито

1 ответ

Решение

При использовании сценариев ограничений с доменом Hibernate вы не используете class декларация или static модификатор, как описано в разделе 15.3 Добавление ограничений документации Grails.

Правильный скрипт ограничения будет:

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

Обратите внимание, что поля без ограничения и круглые скобки в объявлении поля являются необязательными.

Другие вопросы по тегам