Pergunta

Sou novo no Hibernate e estou perplexo. No meu banco de dados, tenho tabelas que têm colunas de TIMESTAMP(6). Estou usando o NetBeans 6.5.1 e quando eu gero o hibernate.reveng.xml, hbm.xml files, e pojo files Ele define as colunas como do tipo Serializable. Não é isso que eu esperava, nem o que eu quero que eles sejam.

eu encontrei isto Poste nos fóruns de hibernato dizendo para colocar:

<sql-type jdbc-type="OTHER" hibernate-type="java.sql.Timestamp" />

no hibernate.reveng.xml Arquivo.

Em Netbeans, você não pode gerar os mapeamentos deste arquivo (ele cria um novo toda vez) e parece não ter a capacidade de re-generá-los do arquivo (pelo menos de acordo com isto Está programado para estar disponível na versão 7).

Então, estou tentando descobrir o que fazer. Estou mais inclinado a acreditar que estou fazendo algo errado, pois sou novo nisso, e parece que seria um problema comum para os outros.

  • Então, o que estou fazendo de errado?
  • Se eu não estou fazendo nada de errado, como faço para trabalhar em torno disso?

Estou usando o NetBeans 6.5, Oracle 10G, e acredito que o Hibernate 3 (veio com o meu NetBeans).

Editar: Pretendia dizer que encontrei isto Pergunta de Stackoverflow, mas é realmente um problema diferente.

ATUALIZAR:O driver do Oracle JDBC que eu estava usando (ojdbc14.jar) é 9.0.2.0.0 Agora também tentei:

  • OJDBC14.JAR Versão 10.2.0.4.0
  • ojdbc6.jar versão 11.2.0.1.0
Foi útil?

Solução

Encontrei um trabalho para esse problema. A questão em si parece girar em torno do fato de que o NetBeans 6.5 (e eu mais tarde versões até este ponto) não permitem que você reverse o engenheiro de um banco de dados de um existente hibernate.reveng.xml Arquivo. Isso está programado para estar disponível na versão 7.

O trabalho que encontrei é criar uma tarefa de formiga para recriar o hbm.xml e arquivos pojo java. Atualmente, tenho isso viciado para acontecer quando faço uma limpeza e construção, mas vou tentar encontrar uma maneira de separá -lo completamente, pois ele só precisará ser executado quando o esquema do banco de dados mudar.

Para conseguir isso quando você faz uma limpeza e construir, embora você precise editar seu build.xml Arquivo.

A primeira parte são as bibliotecas que você precisará. Então adicione:

<path id="toolslib">
        <path location="lib/hibernate-support/hibernate-tools.jar" />
        <path location="lib/hibernate-support/hibernate3.jar" />
        <path location="lib/hibernate-support/freemarker.jar" />
        <path location="lib/hibernate-support/jtidy-r938.jar" />
        <path location="lib/ojdbc14.jar" />
</path>

Você já deve ter os arquivos hibernate-tools.jar, hibernate3.jar e ojdbc14.jar na sua máquina. Então, basta mudar o caminho para eles. o Freemaker.jar e jtidy-r938.jar precisará ser baixado, pois eu não os tinha.

Abaixo disso no build.xml Você precisará adicionar:

<taskdef name="hibernatetool"
     classname="org.hibernate.tool.ant.HibernateToolTask"
     classpathref="toolslib">
    <classpath>
        <fileset dir="lib">
            <include name="**/*.jar"/>
        </fileset>
    </classpath>
</taskdef>

A última seção que você precisará é o conjunto para ser executado na seção pós-limpeza:

<target name="-post-clean">
        <delete dir="src/*Put the foler where your pojos and hbm.xml files are located*"/>
        <hibernatetool>
            <jdbcconfiguration
                configurationfile="src\hibernate.cfg.xml"
                packagename="*the package where you want them recreated*"
                revengfile="src\hibernate.reveng.xml"
                detectmanytomany="true"
            />
            <hbm2hbmxml destdir="src" />
            <hbm2java  destdir="src" />
        </hibernatetool>
</target>
  • A parte deleta excluirá os arquivos HBM e POJO existentes, antes de serem recriados.
  • o configurationfile aponta para o seu arquivo de configuração principal.
  • O nome do pacote é o pacote separado do ponto em que você deseja que eles criem (com.stackoverflow.pojo por exemplo).
  • o revengfile é o arquivo XML de engenharia reversa a ser usada ao criar os arquivos HBM e POJO.
  • o hbm2hbmxml criará o hbm.xml arquivos de suas tabelas.
  • o hbm2java Criará os arquivos java pojo de suas tabelas.

Agora, para que os registros de data e hora do Oracle sejam algo diferente Serializable, edite o hibernate.reveng.xml Arquive e adicione:

<type-mapping>
        <sql-type jdbc-type="OTHER" hibernate-type="java.sql.Timestamp" />
</type-mapping>

Logo após a etiqueta de seleção de esquema.

Portanto, uma limpeza e construção e os registros de data e hora não serão java.sql.Timestamp ao invés de Serializable objetos.

Esta é uma resposta longa que eu conheço, mas isso também deve funcionar para outras mudanças que você teria que definir no hibernate.reveng.xml arquivo (eu acho). Não sou especialista em hibernado, então sua milhagem pode variar com isso.

ATUALIZAR:Então, depois de pesquisar no Google, encontrei isto Site sobre tarefas de formigas personalizadas no NetBeans. Então eu simplesmente mudei o nome do alvo para ser gen-dao E agora ele não é executado toda vez que eu faço uma limpeza e construção, exatamente quando eu o invoco especificamente.

Outras dicas

Enfrentei um problema semelhante e o resolvi escrevendo minha própria estratégia de Revengnamings.

Eu tenho uma tabela com duas colunas como timestamp_with_timezone e timestamp_with_local_timezone e no processo de engenharia reversa, eles estão mapeando para ser sorilizável.

Os tipos de timestamp_with_timezone e timestamp_with_local_timezon são -101 e -102.e, pois não há tipos de mapeamento de hibernato em Java.SQL.Types Para esses tipos, portanto, eles estão mapeando para a sorilizável.

Assim, escrevi minha própria estratégia de Revengnamings, que converte esse tipo em registro de data e hora. Qual estagiário se converte para hibernar o TimestampyType.

public class OracleRevengNamingStrategy extends DefaultRevengNamingStrategy {

    private static final Integer TIMESTAMP_WITH_TIMEZONE_SQL_CODE = -101;

    private static final Integer TIMESTAMP_WITH_LOCAL_TIMEZONE_SQL_CODE = -102;


    public OracleRevengNamingStrategy(ReverseEngineeringStrategy delegate) {
        super(delegate);
    }

    // Converts Timestamp with tomezone and Time stamp with local time zone to Timestamp
    @Override
    public String columnToHibernateTypeName(TableIdentifier table, String columnName, int sqlType, int length, int precision, int scale,
                                            boolean nullable, boolean generatedIdentifier) {
        String type;

        if (sqlType == TIMESTAMP_WITH_TIMEZONE_SQL_CODE || sqlType == TIMESTAMP_WITH_LOCAL_TIMEZONE_SQL_CODE) {
            type = "timestamp";
        } else {
            type = super.columnToHibernateTypeName(table, columnName, sqlType, length, precision, scale, nullable, generatedIdentifier);
        }

        return type;
    }

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top