使用static embedded
は問題ありませんが、私の状況では、独自に定義"user-type"
して GORM マッピングに追加する方が適切でした。
私のクラスには、ランダムに生成されたビジネス キーを持つフィールドが1 つしかないString
ため、この値を varchar として db に格納したいと考えました。解決策は次のとおりです。
Config.groovy
定義では:
grails.gorm.default.mapping={
"user-type" (type: my.package.persistence.PersistentBookKey, class: BookKey)
}
インターフェイスPersistentBookKey
を実装するクラスを作成し、いくつかのメソッドをオーバーライドします。UserType
final class PersistentBookKey implements UserType
{
@Override
protected BookKey createKeyFromString(String key) {
BookKey.from(key)
}
@Override
Class returnedClass() {
BookKey
}
private static int [] SQL_TYPES=[Types.VARCHAR] as int[]
@Override
int[] sqlTypes() {
return SQL_TYPES
}
@Override
boolean equals(Object x, Object y) throws HibernateException {
return x.equals(y);
}
@Override
int hashCode(Object x) throws HibernateException {
return x.hashCode()
}
@Override
Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
def key=rs.getString(names[0])
return this.createKeyFromString(key);
}
@Override
void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
BookKey persistent=value as BookKey
st.setString(index,persistent?.getKey())
}
@Override
Object deepCopy(Object value) throws HibernateException {
return value
}
@Override
boolean isMutable() {
return false //To change body of implemented methods use File | Settings | File Templates.
}
@Override
Serializable disassemble(Object value) throws HibernateException {
return value as Serializable
}
@Override
Object assemble(Serializable cached, Object owner) throws HibernateException {
return cached
}
@Override
Object replace(Object original, Object target, Object owner) throws HibernateException {
return original
}
}
現在、BookKey オブジェクトは Varchar としてデータベースに保存されていますが、取得すると BookKey オブジェクトに変換されます。
詳細については、次を参照してください。
http://grails.org/doc/2.0.x/ref/Database%20Mapping/Usage.html
http://grails.1312388.n4.nabble.com/Working-example-of-user-type-td1377468.html