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á.
Komentáře