Domanda

Sono nuovo di ibernazione e io sono perplesso. Nel mio database ho tabelle che hanno un colonne di TIMESTAMP(6). Sto usando Netbeans 6.5.1 e quando ho generare il hibernate.reveng.xml, hbm.xml files e pojo files imposta le colonne per essere di tipo Serializable. Questo non è quello che mi aspettavo, e non quello che voglio che siano.

questo post sul forum Hibernate dicendo a posto:

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

nel file hibernate.reveng.xml.

In Netbeans non si è in grado di generare le mappature da questo file (crea uno nuovo ogni volta) e non sembra avere la capacità di ri-generare dal file sia (almeno secondo questo è previsto per essere disponibile in versione 7).

Così sto cercando di capire cosa fare. Io sono più propenso a credere che sto facendo qualcosa di sbagliato visto che sono nuovo a questo, e sembra che sarebbe un problema comune per gli altri.

  • Che cosa sto sbagliando?
  • Se io non sto facendo nulla di male, come faccio a risolvere questo?

Sto usando Netbeans 6.5, Oracle 10G, e credo Hibernate 3 (è venuto con i miei NetBeans).

Modifica intendevo dire che ho trovato questo domanda StackOverflow, ma in realtà è un problema diverso.

UPDATE: Il driver JDBC Oracle stavo usando (ojdbc14.jar) è 9.0.2.0.0 Ora ho anche provato:

  • ojdbc14.jar versione 10.2.0.4.0
  • ojdbc6.jar versione 11.2.0.1.0
È stato utile?

Soluzione

Ho trovato un lavoro in giro per questo problema. La questione in sé sembra ruotare intorno al fatto che Netbeans 6.5 (e versioni successive I fino a questo punto) non consentono di invertire ingegnere un database da un file hibernate.reveng.xml esistente. Questo è previsto per essere disponibile in versione 7.

Il lavoro in giro ho trovato è quello di creare un task ant per ricreare i file java hbm.xml e POJO. Al momento ho questa agganciato ad accadere quando faccio un ambiente pulito e costruire, ma ho intenzione di provare a trovare un modo per averlo completamente separata, dal momento che solo bisogno di essere eseguito quando le modifiche dello schema del database.

Per fare questo quando si fa un ambiente pulito e costruire anche se è necessario modificare il file build.xml.

La prima parte è le librerie di cui avrete bisogno. Quindi aggiungi:

<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>

Si dovrebbe già avere il hibernate-tools.jar, hibernate3.jar e file ojdbc14.jar su di voi macchina. Quindi, basta cambiare il percorso a loro. Il freemaker.jar e jtidy-r938.jar avrà bisogno di essere scaricato, come non ho avuto quelli.

Sotto questo nel build.xml è necessario aggiungere:

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

L'ultima sezione è necessario è il set per l'esecuzione in sezione di post-clean:

<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>
  • La porzione Elimina consente di eliminare i file HBM e POJO esistenti, prima di essere ricreati.
  • I punti configurationfile al file di configurazione principale.
  • Il nome del pacchetto è il pacchetto di punti separati che si desidera loro creati in (com.stackoverflow.pojo per esempio).
  • Il revengfile è il file XML reverse engineering da utilizzare durante la creazione dei file HBM e POJO.
  • Il hbm2hbmxml creerà i file hbm.xml delle tabelle.
  • Il hbm2java creerà i file java POJO di tabelle.

Ora per ottenere l'Oracle Timestamp di essere qualcosa di diverso da Serializable, modificare il file hibernate.reveng.xml e aggiungere:

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

subito dopo il tag dello schema-selezione.

Quindi, un ambiente pulito e costruire e il timestamp non saranno java.sql.Timestamp invece di oggetti Serializable.

Questa è una risposta lunga lo so, ma questo dovrebbe funzionare anche per altre modifiche che si dovrebbe impostare nel file hibernate.reveng.xml (credo). Non sono un esperto in sospensione, così il vostro chilometraggio può variare con questo.

UPDATE: Così, dopo un po 'googling ho trovato questo sito a proposito di compiti formica personalizzati in NetBeans. Così ho semplicemente cambiato il nome del target da gen-dao ed ora non viene eseguito ogni volta che faccio un ambiente pulito e costruire, proprio quando ho espressamente invocarlo.

Altri suggerimenti

Ho affrontato problema simile e risolto scrivendo il mio RevengNamingStrategy.

  

Ho una tabella con due colonne come TIMESTAMP_WITH_TIMEZONE e   TIMESTAMP_WITH_LOCAL_TIMEZONE e nel processo di reverse engineering che   sono la mappatura per seralizable.

SqlTypes di tipi TIMESTAMP_WITH_TIMEZONE e TIMESTAMP_WITH_LOCAL_TIMEZONE sono -101 e -102.And Poiché non v'è nessun tipo di mapping Hibernate a java.sql.Types per questi tipi, di conseguenza, essi sono la mappatura a seralizable.

Quindi scritto il mio RevengNamingStrategy, che converte questi tipo di Timestamp.Which stagista converte in letargo TimeStampType.

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;
    }

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top