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