Ben global eşlenen hazırda Kullanıcıtürü kullanmak ve büyük (uygulama http://www.hibernate.org/388.html dayalı, ancak UserType
arayüze kırma değişiklikleri için güncellendi) çalışır: Groovy.config içinde
package company
import org.hibernate.Hibernate
import org.hibernate.usertype.UserType
import java.sql.PreparedStatement
import java.sql.ResultSet
import java.sql.SQLException
import java.sql.Types
/**
* Map CHAR(x) types to String: trim when getting and setting the CHAR(x)
* based on www.hibernate.org/388.html
*/
public class TrimmedString implements UserType {
public TrimmedString() {
}
public int[] sqlTypes() {
return [Types.CHAR] as int[];
}
@SuppressWarnings("unchecked")
public Class returnedClass() {
return String.class;
}
public boolean equals(Object x, Object y) {
return (x == y) || (x != null && y != null && (x.equals(y)));
}
public Object nullSafeGet(ResultSet inResultSet, String[] names, Object o) throws SQLException {
String val = (String) Hibernate.STRING.nullSafeGet(inResultSet, names[0]);
return val == null ? null : val.trim();
}
public void nullSafeSet(PreparedStatement inPreparedStatement, Object o, int i) throws SQLException {
String val = (String) o;
inPreparedStatement.setString(i, val);
}
public Object deepCopy(Object o) {
if (o == null) {
return null;
}
return new String(((String) o));
}
public boolean isMutable() {
return false;
}
public Object assemble(Serializable cached, Object owner) {
return cached;
}
public Serializable disassemble(Object value) {
return (Serializable) value;
}
public Object replace(Object original, Object target, Object owner) {
return original;
}
public int hashCode(Object x) {
return x.hashCode();
}
}
küresel haritalama:
grails.gorm.default.mapping = {
'user-type'(type: company.TrimmedString, class: String) //map Char(x) columns mapped to string fields as trimmed string
}
Doğrulamayı nasıl ele aldınız? Görünüşe göre Grails geçici özellikler üzerindeki kısıtlamaları doğrulamıyor. – jamesallman
Evet - Grails geçici alanlar için standart doğrulamayı kullanmaktan hoşlanmaz. El ile ele almak ve mesajları flaş kapsamına eklemek için uğraşmak zorundasınız. Belki de biraz daha saydam hissettirmek ve oradaki doğrulamayı yapmak için BeforeSave önleyiciyi kullanmayı düşünebilirsiniz. –
** Görüntüleme hoş bir çözümdür **. Görünümler yalnızca alt sorgular olarak değiştirilir, bazı DB motorları sonuç sorgularını optimize edebilir (alt sorguları önler). Ayrıca görünümde çok fazla katılımınız varsa ** materyalize görünüm ** oluşturmak mümkündür. Tablodan gelen ** indeksler ** göz önünde bulundurulur. – gavenkoa