O velho problema de Conversão de tipos no JPA! Agradeço qualquer ajuda

Bem, o problema é um velho conhecido.

Tenho um tipo booleno ao qual o jpa nao consegue converter para um tipo esperado em uma tabela.

No meu caso tenho uma tabela no oracle com “char(1”) com os valores “S” e “N” para representar um boolean.

Meu problema:

  1. eu não gosto de usar anotações, acho que polue muito as classes e as tornam especificas de dominio ao invez de um bom e velho pojo. Logo o meu mapeamento está todo em XML e as minhas classes de dominio são todas pojos simples sem anotações especificas de qualquer solução.

  2. Já tentei todas as soluções possiveis e agora estou analizando a possibilidade de resolver remapeando atravez do dialeto do hibernate. Tomei como base a classe abaixo.

public class CustomOracleDialect extends Oracle9iDialect {

    public OracleDialect() {
        super();
        registerColumnType(Types.BIT, "char(1)");
    //registerColumnType(Types.BOOLEAN, "char(1)");
    }
}

problema, ele até gera um banco da forma esperada colocando o char(1) como tipo da tabela. Coisa que também já era feita antes usando:

         <basic name="ativo">
               <column name="ativo" length="1" nullable="false" column-definition="char(1)" />
           </basic>

ou seja, consegui reproduzir no hibernate oque já poderia fazer no xml.

O que me falta é o jpa fazer a substituicao de TRUE por “S” e FALSE por “N”. Já tentei o isso associado ao:

<property name="hibernate.query.substitutions" value="true 'S', false 'N'" />

bem… até agora nada.

outra solução inviavel no meu caso é fazer uso do toplink neste caso particular.

Acho que vc precisa mapear usando um tipo customizado.

O hibernate já vem com algo parecido c/ o que vc quer, mas mapeia um boolean p/ um char(1) usando ‘Y’ ou ‘N’.

http://www.hibernate.org/hib_docs/v3/api/org/hibernate/type/YesNoType.html

Se vc quer gravar ‘S’ ou ‘N’, talvez possa usar o fonte dessa classe como base e escrever seu próprio user type.

Ao invés de colocar:

<property name="hibernate.query.substitutions" value="true 'S', false 'N'" />

Tenta colocar assim e vê se funciona:

<property name="query.substitutions">true 'S', false 'N'</property>

[]´s

[quote=joca_java]Ao invés de colocar:

<property name="hibernate.query.substitutions" value="true 'S', false 'N'" />

Tenta colocar assim e vê se funciona:

<property name="query.substitutions">true 'S', false 'N'</property>

[]´s[/quote]

Dentro do arquivo XML de configurações do JPA a notação para as propriedades do hibernate é diferente…
Depois posto um exemplo, mas é assim mesmo.