Grails-HibernateXML-自定义列名

Grails-HibernateXML-自定义列名,hibernate,grails,Hibernate,Grails,我有一个Grails项目,它在src/groovy文件夹中使用HibernateXML和域类。我正在从1.0.3升级到1.3.7。HibernateXML对某些属性具有自定义列名,而域类使用这些属性。但是,当我运行应用程序时,它会为属性生成新列,就像它们没有列属性一样: <class name="User" table="x_users"> <cache usage="read-write"/> <comment>Use

我有一个Grails项目,它在src/groovy文件夹中使用HibernateXML和域类。我正在从1.0.3升级到1.3.7。HibernateXML对某些属性具有自定义列名,而域类使用这些属性。但是,当我运行应用程序时,它会为属性生成新列,就像它们没有列属性一样:

    <class name="User" table="x_users">
        <cache usage="read-write"/>
        <comment>User</comment>
...
<property name="emailAddress" column="emailAddress"/>
...
</class>

</hibernate-mapping>
用于用户的XML:

    <class name="User" table="x_users">
        <cache usage="read-write"/>
        <comment>User</comment>
...
<property name="emailAddress" column="emailAddress"/>
...
</class>

</hibernate-mapping>
这将导致在运行应用程序时创建“电子邮件地址”列。有什么想法吗

    <class name="User" table="x_users">
        <cache usage="read-write"/>
        <comment>User</comment>
...
<property name="emailAddress" column="emailAddress"/>
...
</class>

</hibernate-mapping>
更新:

    <class name="User" table="x_users">
        <cache usage="read-write"/>
        <comment>User</comment>
...
<property name="emailAddress" column="emailAddress"/>
...
</class>

</hibernate-mapping>
即使我向域类添加映射,它仍然会创建新列:

    <class name="User" table="x_users">
        <cache usage="read-write"/>
        <comment>User</comment>
...
<property name="emailAddress" column="emailAddress"/>
...
</class>

</hibernate-mapping>
class User {
    static mapping = {
        emailAddress column:'emailAddress'
        }
}

您可以自定义域类本身中的列名,例如

    <class name="User" table="x_users">
        <cache usage="read-write"/>
        <comment>User</comment>
...
<property name="emailAddress" column="emailAddress"/>
...
</class>

</hibernate-mapping>
class User {
  String emailAddress

  static mapping = {
    emailAddress column: "emailAddress"        
  }
}

看起来您无法在Hibernate3XML中为Grails指定大写字母。当我将映射更改为:

    <class name="User" table="x_users">
        <cache usage="read-write"/>
        <comment>User</comment>
...
<property name="emailAddress" column="emailAddress"/>
...
</class>

</hibernate-mapping>
 <class name="User" table="x_users">
        <cache usage="read-write"/>
        <comment>User</comment>
...
<property name="emailAddress" column="test"/>
...
</class>

使用者
...
...

它工作正常。当我将其更改为小写时,它工作正常,但引入大写会使其与默认值一致。

@skaz:我认为您最好将域类放入
grails app/domain
文件夹中。文件夹
src/groovy
用于非持久性域类(不会保存在数据库中),因此它不会以grails映射方式。这也是Don的方法不起作用的原因

    <class name="User" table="x_users">
        <cache usage="read-write"/>
        <comment>User</comment>
...
<property name="emailAddress" column="emailAddress"/>
...
</class>

</hibernate-mapping>

根据我的经验,移植不会太难。之后,您可以删除hibernate配置,只使用grails ORM映射(正如Don所指出的)。

但我真的必须在这两个地方都这样做吗?即使这样做不起作用-它完全忽略了src/groovy folder.Long中的映射-当您使用hibernate XML时,您不能将它们放在grails app/domain文件夹中。此外,这与为什么Don的方法不起作用无关。我将发布一个关于原因的答案。@skaz:很抱歉没有明确的解释,但我的建议是放弃HibernateXML并接受Grails的完全支持。当您使用Hibernate XML进行配置时,与其他Java框架(Spring、Struts…)一样,您也不会从Grails的支持中获得太多优势。@skaz:据我所知,如果类位于Grails app/domain文件夹中,Don的方法在没有XML配置的情况下工作。但在src/groovy文件夹中,它将不起作用。
    <class name="User" table="x_users">
        <cache usage="read-write"/>
        <comment>User</comment>
...
<property name="emailAddress" column="emailAddress"/>
...
</class>

</hibernate-mapping>