2013-12-18 36 views
0

我正在使用grails 2.3.4,並且我有一個嵌入對象的域類。嵌入式對象有一個名爲'版本'的屬性,它似乎與GORM自動添加到數據庫表中的'版本'字段衝突。結果是屬於我的嵌入式對象的'版本'字段不會在數據庫中創建,因此我的應用程序無法正常工作。Grails,導致問題的域類中的嵌入對象中的屬性名稱

我的代碼如下所示:

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文件),因爲其他項目使用它我不允許觸摸它。所以解決方案需要完全在我的域類中完成,或者至少以不改變嵌入對象的類的方式完成。

+0

你需要對Grails自帶的這個域類進行版本控制嗎?如果沒有,你嘗試禁用它? –

+0

不幸的是,禁用樂觀鎖定是一種選擇。並禁用它也沒有工作。 – FighterHayabusa

+0

然後,由於您將這個其他類嵌入到您的域類中,因此它的版本屬性與樂觀鎖定使用的版本之間會存在衝突。簡單地說,它不會工作。抱歉。 –

回答

0

我實際上通過使用Hibernate UserType來表示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) 
    } 
} 

EmbeddedThing.groovy:

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

配置。 groovy:

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

版本是一個特殊的列名,您應該在EmbeddedThin類中重命名版本

+0

這是我的第一個衝動,但正如我所提到的,EmbeddedThing類屬於我不允許進行更改的子項目。 – FighterHayabusa

-1

請嘗試version false在你的「靜態映射」,對於「EmbeddedThing」級。

+0

正如問題中所述,無法對EmbeddedThing進行修改。 –

相關問題