Domanda

I usare Hibernate per generare automaticamente il mio database per la prova, e ho alcune tabelle nel mio schema che contengono dati statici che richiede un tempo molto lungo per importare. In passato, ho usato il seguente codice nel mio file build per generare il database (da file di mapping):

<target name="schema-gen" depends="hibernate-gen">
    <taskdef name="schemaexport" classname="org.hibernate.tool.hbm2ddl.SchemaExportTask" classpathref="project.classpath" />

    <schemaexport properties="resources/hibernate.properties" text="false" quiet="false" delimiter=";" output="schema.sql">
        <fileset dir="${build.doclets}">
            <include name="**/*.hbm.xml" />
            <exclude name="**/inert/*.hbm.xml" />
        </fileset>
    </schemaexport>
</target>

I file .hbm.xml sono stati generati utilizzando XDoclet. Sto migrando ad usare Hibernate annotazioni per la mappatura, quindi mi sto muovendo per hibernatetools per generare lo schema:

<target name="annotations-export" depends="hibernate-gen">
    <hibernatetool destdir="${basedir}">
        <annotationconfiguration configurationfile="${basedir}/resources/hibernate.cfg.xml" propertyfile="${basedir}/resources/hibernate.properties" />
        <classpath>
            <path refid="project.classpath" />
        </classpath>
        <hbm2ddl drop="true" create="true" export="true" outputfilename="schema.sql" delimiter=";" format="true" />
    </hibernatetool>
</target>

Mi piacerebbe essere in grado di dire hbm2ddl di lasciare fuori le classi nel pacchetto "inerte", proprio come facevo con SchemaExport. Qualcuno sa se c'è un modo per farlo?

È stato utile?

Soluzione 2

La soluzione finii per andare con è stato la creazione di una configurazione di Hibernate separato con esattamente le classi che volevo per mappare ed usando che per l'attività di esportazione anziché l'altra configurazione Hibernate con tutte le classi mappate.

Altri suggerimenti

Questo dovrebbe funzionare:

<target name="annotations-export" depends="hibernate-gen">
    <hibernatetool destdir="${basedir}">
        <annotationconfiguration configurationfile="${basedir}/resources/hibernate.cfg.xml" propertyfile="${basedir}/resources/hibernate.properties">
            <fileset dir="${build.doclets}">
                <include name="**/*.class" />
                <exclude name="**/inert/*.class" />
            </fileset>
        </annotationconfiguration>
        <classpath>
            <path refid="project.classpath" />
        </classpath>
        <hbm2ddl drop="true" create="true" export="true" outputfilename="schema.sql" delimiter=";" format="true" />
    </hibernatetool>
</target>

hai provato la update attributo del tag hbmddl ?

<hbm2ddl update="true" ...

qui per i dettagli

che dovrebbe funzionare

Se si dispone di questa situazione e vi capita di non voler Hibernate per aggiornare i dati di nelle tabelle sia, allora si può sostituire:

<class name="FooClass" table="FOO_TABLE"></class>

con

<class name="Foo" subselect="select * from FOO_TABLE">
  <synchronize table="FOO_TABLE">
</class>

quindi lo strumento di esportazione dello schema lo ignorerà, ma così sarà qualsiasi scrittura. Almeno, questo è ciò che suggerisce la documentazione.

  

selezione secondaria (opzionale): mappe un'entità immutabile e di sola lettura a un   database di selezione secondaria.

ho scoperto questo attraverso guardando la funzione Table.isPhysicalTable. Si potrebbe anche considerare di usare AbstractUnionTables, che sono l'altra eccezione.

mi capita di voler oggetti immutabili.

Il mio caso d'uso è che voglio caricare edizioni immutabili forma leggermente diversa di alcuni oggetti Hibernate gestito senza il rischio di modificare accidentalmente l'esportazione dello schema. Così subselect è piuttosto ben adatto a questo.

Purtroppo sarà lettiera tutte le vostre domande con quella sub-SELECT, che il database dovrebbe essere in grado di ottimizzare la via, ma le persone hanno diverse quantità di fiducia in ottimizzazione del database con buona ragione.

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