Grails,域类中嵌入对象的属性名导致问题

Grails,域类中嵌入对象的属性名导致问题,grails,gorm,Grails,Gorm,我使用的是Grails2.3.4,我有一个嵌入对象的域类。嵌入对象有一个名为“version”的属性,这似乎与GORM自动添加到数据库表中的“version”字段相冲突。结果是数据库中没有创建属于嵌入对象的“version”字段,因此我的应用程序无法正常工作 我的代码如下所示: class Thing { String someText EmbeddedThing embeddedThing Date someDate static embedded = ['embeddedT

我使用的是Grails2.3.4,我有一个嵌入对象的域类。嵌入对象有一个名为“version”的属性,这似乎与GORM自动添加到数据库表中的“version”字段相冲突。结果是数据库中没有创建属于嵌入对象的“version”字段,因此我的应用程序无法正常工作

我的代码如下所示:

class Thing {
  String someText
  EmbeddedThing embeddedThing
  Date someDate

  static embedded = ['embeddedThing']

  static constraints = {
    embeddedThing(unique: true)
  }
}

class EmbeddedThing {
  String textOfSomeSort
  String version
  String textOfSomeOtherSort
}

您可能认为一个快速修复方法是重命名嵌入对象的“version”属性,但该类属于一个包含的子项目,即一个JAR文件,因为其他项目使用它,所以我不允许接触该文件。因此,解决方案需要完全在my domain类中完成,或者至少以不改变嵌入对象的类的方式完成。

版本是一个特殊的列名,您应该重命名您的EmbeddedThin类中的版本字段。

请在“静态映射”中尝试版本false,对于“EmbeddedThing”类。

我实际上通过使用Hibernate用户类型来表示EmbeddedThing类找到了这个问题的解决方案。 我的代码现在看起来像这样,并且工作得非常完美:

Thing.groovy:

import EmbeddedThingUserType

class Thing {
  String someText
  EmbeddedThing embeddedThing
  Date someDate

  static embedded = ['embeddedThing']

  static mapping = {
    version false
    embeddedThing type: EmbeddedThingUserType, {
      column name: "embedded_thing_text"
      column name: "embedded_thing_version"
      column name: "embedded_thing_other_text"
    }
  }

  static constraints = {
    embeddedThing(unique: true)
  }
}
class EmbeddedThing {
  String textOfSomeSort
  String version
  String textOfSomeOtherSort
}
EmbeddedThing.groovy:

import EmbeddedThingUserType

class Thing {
  String someText
  EmbeddedThing embeddedThing
  Date someDate

  static embedded = ['embeddedThing']

  static mapping = {
    version false
    embeddedThing type: EmbeddedThingUserType, {
      column name: "embedded_thing_text"
      column name: "embedded_thing_version"
      column name: "embedded_thing_other_text"
    }
  }

  static constraints = {
    embeddedThing(unique: true)
  }
}
class EmbeddedThing {
  String textOfSomeSort
  String version
  String textOfSomeOtherSort
}
EmbeddedThingUserType.groovy:

class EmbeddedThingUserType implements UserType {
  int[] sqlTypes() {
    return [StringType.INSTANCE.sqlType(),
        StringType.INSTANCE.sqlType(),
        StringType.INSTANCE.sqlType()]
  }

  Class returnedClass() {
    return EmbeddedThing
  }

  public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner)
      throws HibernateException, SQLException {
    if (resultSet && names) {
      return new EmbeddedThing(
          textOfSomeSort: resultSet?.getString(names[0] ?: '_missing_textOfSomeSort_'),
          version: resultSet?.getString(names[1] ?: '_missing_version_'),
          textOfSomeOtherSort: resultSet?.getString(names[2] ?: '_missing_textOfSomeOtherSort_'))
    } else {
      return null
    }
  }

  public void nullSafeSet(PreparedStatement preparedStatement, Object value, int index)
      throws HibernateException, SQLException {
    if (value != null) {
      preparedStatement.setString(index, value?.textOfSomeSort)
      preparedStatement.setString(index + 1, value?.version)
      preparedStatement.setString(index + 2, value?.textOfSomeOtherSort)
    } else {
      preparedStatement.setString(index, '_missing_textOfSomeSort_')
      preparedStatement.setString(index + 1, '_missing_version_')
      preparedStatement.setString(index + 2, '_missing_textOfSomeOtherSort_')
    }
  }

  @Override
  public boolean isMutable() {
    return false
  }

  @Override
  public boolean equals(Object x, Object y) throws HibernateException {
    return x.equals(y)
  }

  @Override
  public int hashCode(Object x) throws HibernateException {
    assert (x != null)
    return x.hashCode()
  }

  @Override
  public Object deepCopy(Object value) throws HibernateException {
    return value
  }

  @Override
  public Object replace(Object original, Object target, Object owner)
      throws HibernateException {
    return original
  }

  @Override
  public Serializable disassemble(Object value) throws HibernateException {
    return (Serializable) value
  }

  @Override
  public Object assemble(Serializable cached, Object owner)
      throws HibernateException {
    return cached
  }
}
Config.groovy:

grails.gorm.default.mapping = {
    'user-type'( type: EmbeddedThingUserType, class: EmbeddedThing)
}

您需要对Grails附带的这个域类进行版本控制吗?如果没有,您是否尝试过禁用它?不幸的是,禁用乐观锁定是一个选项。然后,由于您正在域类中嵌入另一个类,因此它的version属性与乐观锁定使用的版本之间存在冲突。简单地说,这是行不通的。对不起,恐怕这就是答案。我必须和EmbeddedThing类的负责人谈谈,看看他们是否允许我更改“version”属性的名称。谢谢。这是我的第一个冲动,但正如我提到的,EmbeddedThing类属于一个子项目,我不允许对其进行更改。正如问题中所述,不能对EmbeddedThing进行修改。