26 Aralık 2019 Perşembe

UserType Arayüzü

Giriş
Bir sütun veritabanından okunurken veya yazılırken çevrim için kullanılmasını istediğimiz sınıfı belirtmek için kullanılır. @Type anotasyonu ile kullanılır

Örnek
Şöyle yaparız
@Type(type = "com.vladmihalcea.book.hpjp.hibernate.type.CharacterType")
@Column(name = "event_type")
private Character type;
assemble metodu
Genellikle şöyle yaparız. Nesne Second level cache'ten okununca çağrılır..
@Override
public Object assemble(Serializable cached, Object owner) {
  return cached;
}
deepCopy metodu
Genellikle şöyle yaparız
@Override
public Object deepCopy(Object value) {
  return value;
}
disassemble metodu
Genellikle şöyle yaparız. Nesne Second level cache'te saklanmadan önce çağrılır.
@Override
public Serializable disassemble(Object o) {
  return (Serializable) o;
}
equals metodu
Genellikle şöyle yaparız. Eğer iki nesnenin referansı aynı ise Hibernate nesneyi tekrar veritabanına yazmaz.
@Override
public boolean equals(Object x, Object y) {
  return Objects.equals(x, y);
}
hashCode metodu
Genellikle şöyle yaparız.
@Override
public int hashCode(Object x) {
  return x.hashCode();
}
isMutable metodu
Genellikle şöyle yaparız. Bu kod ile veritabanından yüklenen değeri değiştirip tekrar kaydetmek istemediğimizi belirtiyoruz.
@Override
public boolean isMutable() {
  return false;
}
nullSafeGet metodu
Hibernate 5 ile imzası şöyle. Hibernate 4 ve daha eski sürümlede bu metodun imzası hep değişmiş. Hibernate 3'ten Hibernate 4'e geçerken değişmiş.
@Override
public Object nullSafeGet(ResultSet rs, String[] names,
        SharedSessionContractImplementor session, Object owner) 
throws HibernateException, SQLException ; 
Eski imzası şöyle.
@Override
public Object nullSafeGet(ResultSet rs, String[] names, Object owner) 
throws HibernateException, SQLException ; 
Örnek
ResultSet nesnesinden okumak için şöyle yaparız. İlk sütunu okuruz, eüer string var ise ilk karakteri döneriz, yok ise null döneriz. Metodun imzası Object döndüğü için Character dönmek sorun değil.
String value = rs.getString(names[0]);
return (value != null && value.length() > 0) ? 
  value.charAt(0) : null;
Örnek
Şöyle yaparız
@Override
public Object nullSafeGet(ResultSet resultSet, String[] names,
 SessionImplementor session, Object owner)
throws HibernateException, SQLException {

  if (resultSet.getArray(names[0]) == null) {
    return new String[0];
  }

  Array array = resultSet.getArray(names[0]);
  @SuppressWarnings("unchecked")
  T javaArray = (T) array.getArray();
  return javaArray;
}
nullSafeSet metodu
Hibernate 5 ile imzası şöyle. Hibernate 4 ve daha eski sürümlede bu metodun imzası hep değişmiş. Hibernate 3'ten Hibernate 4'e geçerken değişmiş.
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index,
        SharedSessionContractImplementor session) 
throws HibernateException, SQLException;
Eski imzası şöyle.
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index) 
throws HibernateException, SQLException;
Örnek
PrepararedStatement'a yazmak için şöyle yaparız.
if (value == null) {
  st.setNull(index, Types.CHAR);
} else {
  st.setString(index, String.valueOf(value));
}
replace metodu
Detached nesneyi merge etmek için çağrılır.
Örnek
Genellikle şöyle yaparız.
@Override
public Object replace(Object o, Object target, Object owner) {
  return o;
}
Örnek
Şöyle yaparız.
@Override
public Object replace(Object original, Object target, Object owner)
throws HibernateException {
  return original;
}
returnedClass metodu
İmzası şöyle. Bu sınıfın okuyup yazdığı kendi kodumuzdaki sınıf tipini belirtir. @Type ile verilen ilk örnekte bizim kodumuz Character nesnesidir. Foo da olabilirdi.
@Override
public Class returnedClass();
Örnek
Şöyle yaparız.
public class GenericStringArrayUserType<T extends Serializable> implements UserType {

  private Class<T> typeParameterClass;

  @Override
  public Class<T> returnedClass() {
    return typeParameterClass;
  }
}

sqlTypes metodu
char sütun tipi için şöyle yaparız.
@Override
public int[] sqlTypes() { 
  return new int[]{Types.CHAR}; 
}