2011-07-12 14 views
5

Jakie są możliwe rozwiązania usuwania pustych białych znaków podczas mapowania pól char w starszej bazie danych?Usuwanie pustych spacji z pól znaków w starszej bazie danych za pomocą Grails GORM

widzę następujące opcje:

  • Wywołanie .trim() w punkcie obsługi (sterownik, widok, etc)
  • Akcesory własności Zastąp, aby powrócić .trim()
  • Korzystanie z hibernacji UserType przyciąć białe znaki

Jestem skłonny dążyć do nadpisania właściwości właściwości, aby właściwości domeny pozostały spójne w całej aplikacji .

Odpowiedz

2

Miałem podobny problem i nie mogłem zmienić starszych danych. Skończyło się na zastąpienie akcesorium ze względu na przejrzystość dla moich kolegów deweloperów. Polecam używanie pola przejściowego, więc nie musisz przycinać Stringa przy każdym połączeniu. Jednak; jeśli możesz po prostu wyczyścić dane w tabeli, utworzyć widok lub przenieść do nowej tabeli, zrobiłbym to zamiast tego.

+0

W jaki sposób obsłużyłeś sprawdzanie oryginalności? Wygląda na to, że Grails nie sprawdza poprawności właściwości przejściowych. – jamesallman

+0

Tak - Grails nie lubi używać standardowego sprawdzania poprawności dla zmiennych przejściowych. Będziesz musiał obsługiwać go ręcznie i radzić sobie z dodawaniem wiadomości do zakresu flashowania. Być może możesz spojrzeć na użycie przechwytywacza beforeSave, aby poczuł się trochę bardziej przejrzysty i umieścić tam walidację. –

+1

** Widoki to dobre rozwiązanie **. Widoki po prostu zastąpione jako podzapytania, niektóre silniki DB mogą zoptymalizować uzyskane zapytania (uniknij podzapytań). Również możliwe jest zbudowanie ** zmaterializowanego widoku **, jeśli masz dużo połączeń w widoku. Wszelkie ** indeksy ** z tabeli uwzględniają w widoku. – gavenkoa

3

używam odwzorowaną globalnie hibernacji UserType i działa świetnie (realizacja na podstawie http://www.hibernate.org/388.html, ale aktualizowany za złamanie zmian w interfejsie UserType):

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(); 
    } 
} 

globalnego mapowania w Groovy.config:

grails.gorm.default.mapping = { 
    'user-type'(type: company.TrimmedString, class: String) //map Char(x) columns mapped to string fields as trimmed string 
} 
Powiązane problemy