Frage

Ich bin neu in dem Ruhezustand, und ich bin ratlos. In meiner Datenbank habe ich Tabellen, die ein Spalten von TIMESTAMP(6) haben. Ich benutze Netbeans 6.5.1 und wenn ich die hibernate.reveng.xml, hbm.xml files erzeugen, und pojo files es setzt die Spalten des Typs Serializable sein. Das ist nicht das, was ich erwartet hatte, noch das, was ich möchte, dass sie sein.

fand ich diese Post in den Foren Hibernate Ort sagen:

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

in der hibernate.reveng.xml Datei.

In Netbeans Sie nicht in der Lage sind die Zuordnungen aus dieser Datei zu erzeugen (es erstellt einen neuen jedes Mal) und es scheint nicht in der Lage sein, um wieder zu erzeugen sie aus der Datei entweder (zumindest nach dies es ist geplant, in der Version 7) zur Verfügung steht.

Also ich versuche, herauszufinden, was zu tun ist. Ich bin eher geneigt zu glauben, dass ich etwas falsch mache, da ich bin hier, und es scheint, wie es ein häufiges Problem für andere sein würde.

  • Also, was mache ich falsch?
  • Wenn ich nicht etwas falsch zu machen, wie funktionieren um ich das?

Ich bin mit Netbeans 6.5, Oracle 10G, und ich glaube, Hibernate 3 (es kam mit meinem Netbeans).

Edit: Meant zu sagen, dass ich gefunden diese Stackoverflow Frage, aber es ist wirklich ein anderes Problem.

UPDATE: Der Oracle-JDBC-Treiber war ich mit (ojdbc14.jar) ist 9.0.2.0.0 Ich habe jetzt auch versucht:

  • ojdbc14.jar Version 10.2.0.4.0
  • ojdbc6.jar Version 11.2.0.1.0
War es hilfreich?

Lösung

fand ich eine Arbeit um für dieses Problem. Die Frage selbst scheint die Tatsache, dass Netbeans 6.5 (und ich spätere Versionen bis zu diesem Punkt) zu drehen, um nicht zulassen, dass Sie eine Datenbank aus einer bestehenden Datei hibernate.reveng.xml Reverse Engineering. Dies ist geplant, in der Version 7 zur Verfügung steht.

Die Arbeit um Ich fand ist eine Ameise Aufgabe zu erstellen, um die hbm.xml und pojo Java-Dateien zu erstellen. Im Moment habe ich diese süchtig passieren, wenn ich ein saubere und bauen, aber ich werde versuchen, einen Weg zu finden es völlig getrennt zu haben, da es nur ran, wenn die Datenbank Schemaänderungen benötigt werden.

Um dies zu erreichen, wenn Sie eine saubere und Build tun, obwohl Sie Ihre build.xml Datei bearbeiten müssen.

Der erste Teil ist die Bibliotheken, die Sie benötigen. So fügen Sie:

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

Sie sollten bereits die Hibernate-tools.jar, hibernate3.jar und ojdbc14.jar Dateien auf Ihrem Gerät. So ändern Sie einfach den Weg zu ihnen. Die freemaker.jar und jtidy-r938.jar werden heruntergeladen müssen, da ich nicht jene hatte.

Darunter im build.xml müssen Sie hinzufügen:

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

Der letzte Abschnitt müssen Sie die Menge in dem post-clean Abschnitt auszuführen:

<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>
  • Der Löschabschnitt wird die bestehende hbm und pojo Dateien löschen, bevor sie neu erstellt werden.
  • Die configurationfile Punkte zu Ihrer Hauptkonfigurationsdatei.
  • Der Paketname ist der abgetrennte dot Paket Sie wollen in (com.stackoverflow.pojo zum Beispiel) erstellt.
  • Die revengfile ist die Reverse-Engineering-XML-Datei zu verwenden, wenn die hbm und pojo Dateien.
  • Die hbm2hbmxml werden die hbm.xml Dateien Ihrer Tabellen erstellen.
  • Die hbm2java wird die Java-pojo Dateien Ihrer Tabellen erstellen.

Nun ist der Oracle-Zeitstempel, um etwas anderes als Serializable, bearbeiten die hibernate.reveng.xml Datei und fügen Sie zu sein:

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

kurz nach dem Schema-Auswahl-Tag.

So ein sauberes und bauen und die Zeitstempel nicht java.sql.Timestamp statt Serializable Objekte sein.

Dies ist eine lange Antwort, die ich weiß, aber dies sollte auch für alle anderen Änderungen arbeiten, dass Sie Satz in der hibernate.reveng.xml Datei haben würde (glaube ich). Ich bin kein Experte in Hibernate, so Ihre Laufleistung mit je.

UPDATE: So, nachdem einige Googeln fand ich this Seite über benutzerdefinierte ant Aufgaben in Netbeans. Also habe ich einfach den Namen des Ziels sein gen-dao geändert und jetzt ist es nicht jedes Mal, wenn ich eine saubere und zu bauen, nur wenn ich speziell invoke ausführen.

Andere Tipps

ich konfrontiert ähnliches Problem und gelöst es durch meine eigene RevengNamingStrategy zu schreiben.

  

Ich habe eine Tabelle zwei Spalten als TIMESTAMP_WITH_TIMEZONE mit und   TIMESTAMP_WITH_LOCAL_TIMEZONE und in Reverse-Engineering-Prozess, der sie   sind Mapping seralizable.

SqlTypes von TIMESTAMP_WITH_TIMEZONE und TIMESTAMP_WITH_LOCAL_TIMEZONE Typen -101 und -102.And Da es keine Hibernate Mapping-Arten in java.sql.Types für diese Typen, daher sind sie Mapping seralizable.

So schrieb meinen eigenen RevengNamingStrategy, die diese Art zu Timestamp.Which intern wandelt wandeln TimeStampType zu überwintern.

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

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top