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