úterý 20. listopadu 2007

Hibernate: Řekněte Ano místo Yes

V Hibernate existuje yes_no typ, který vám umožňuje mapovat B(b)oolean property na databázové sloupce typu CHAR(1). Pro pravdivostní hodnotu true je při reprezentaci v databázi použito hodnoty 'Y' a pro false 'N'. Občas se ale setkáte s databází jejíž tvar nemůžete ovlivnit a pro pravdivostní hodnoty jsou použity jiné zástupné znaky např. 'A', 'N' (ano/ne) nebo 'J', 'N' (ja/nein). Pro některé typy úkolů sice postačuje modifikovat nastavení hibernate, aby v dotazech na yes_no hodnotu nahradil příslušné znaky:

<prop key="hibernate.query.substitutions">yes 'A', no 'N'</prop>

Tento přístup si ale už neporadí s nahráváním celých objektů z databáze - také hodnoty 'A' budou konvertovány na false. V tomto případě se hodí vytvořit si nový typ a můžeme využít toho, co pro nás už Hibernate připravil. Rozšíříme abstraktní třídu CharBooleanType:

package cz.mujpackage;

import org.hibernate.type.CharBooleanType;

/**
* Ano/Ne typ pro reprezentaci booleanu v databazi pomoci znaku
* 'A' a 'N'
* @author Josef Cacek
*/
public class AnoNeType extends CharBooleanType {

  private static final long serialVersionUID = 1L;

  /**
   * @see org.hibernate.type.CharBooleanType#getTrueString()
   */
  protected final String getTrueString() {
    return "A";
  }

  /**
   * @see org.hibernate.type.CharBooleanType#getFalseString()
   */
  protected final String getFalseString() {
    return "N";
  }

  public String getName() { return "ano_ne"; }

}

Teď už jenom říct Hibernatu, že chceme tento typ použít pro náš sloupec

<property name="sloupec" type="cz.mujpackage.AnoNeType" column="SLOUPEC"/>

a v Java beaně si vytvořit odpovídající B(b)oolean property:

private Boolean sloupec;

public Boolean getSloupec() {
  return sloupec;
}

public void setSloupec(Boolean sloupec) {
  this.sloupec = sloupec;
}

Jsme hotovi a všechno krásně funguje. Hibernatu třikrát hurá.

Žádné komentáře: