Portabilidade de Campos Tipo Boolean no Hibernate

Caros, imaginem que crio um banco de dados para uma aplicação Java utilizando o Hibernate para persistencia. Este banco foi inicalmente concebido no Postgresql. Em uma das tabelas, há um campo do tipo Boolean.
Posteriormente, utilizando uma facilidade do próprio Hibernate, desejo passar a utilizar o banco Firebird. Lembrando que o mesmo não possui campos do tipo Boolean, como devo proceder para solucionar esta questão, uma vez que os mapeamentos e classes foram criadas utilizando este campo como sendo Boolean?

o Firebird não tem campos boolean???

:shock:

Simples,

nos atributos booleanos na entidade sete o Type com a anotação:

@org.hibernate.annotations.Type(type = "br.com.seupacote. SimNaoBooleanType")
private Boolean ativo;

e crie a classe:

package br.com.seupacote;

import org.hibernate.type.CharBooleanType;

@SuppressWarnings("serial")
public class SimNaoBooleanType extends CharBooleanType {

	@Override
	protected String getTrueString() {
		return "S";
	}

	@Override
	protected String getFalseString() {
		return "N";
	}

	@Override
	public String getName() {
		return "sim_nao";
	}

}

Com isto agora no seu campo ele vai armazenar S ou N para valores true ou false e o Hibernate vai fazer a conversão automaticamente.

Isto é necessário visto que nem todos os bancos tem suporte a tipos booleanos, então o que é feito é criar um campo com valor Varchar de tamanho 1.

Blz.

Eu deixo isso para o Hibernate e o banco decidir. No MySQL por exemplo o Hibernate cria um campo byte(1) para mapear boolean. Já no pgsql ele cria um campo boolean de verdade, e no Oracle cria um number(1) usando 0 = false 1= true.

Internamente nenhum banco de dados tem. O pgsql por exemplo tem o tipo boolean, porém internamente ele grava como 0 ou 1. Já no Oracle o MySQL esses tipos nem existem, você tem que usar 0 ou 1; ou então as gambiarras como o pessoal costuma fazer de usar char(1) com S ou N :roll: