Question

Je suis nouveau mise en veille prolongée et je suis perplexe. Dans ma base de données que j'ai des tables qui ont une colonne de TIMESTAMP(6). J'utilise Netbeans 6.5.1 et quand je produis le hibernate.reveng.xml, hbm.xml files et pojo files il définit les colonnes à être de type Serializable. Ce n'est pas ce que je pensais, ni ce que je veux qu'ils soient.

J'ai trouvé cette post sur les forums de mise en veille prolongée disant placer:

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

dans le fichier hibernate.reveng.xml.

Dans Netbeans vous n'êtes pas en mesure de générer les applications de ce fichier (il crée un nouveau à chaque fois) et il ne semble pas avoir la capacité de les re-générer à partir du fichier soit (au moins selon cette il est prévu pour être disponible dans la version 7).

Je suis en train de comprendre ce qu'il faut faire. Je suis plus enclin à croire que je suis en train de faire quelque chose de mal puisque je suis nouveau à cela, et il semble que ce serait un problème commun pour les autres.

  • Alors qu'est-ce que je fais mal?
  • Si je ne fais rien de mal, comment puis-je travaille autour de cela?

J'utilise Netbeans 6.5, Oracle 10G, et je crois Hibernate 3 (il est venu avec mes NetBeans).

Modifier a voulu dire que j'ai trouvé cette question stackoverflow, mais il est vraiment un problème différent.

Mise à jour: Le pilote jdbc oracle j'utilisais (de ojdbc14.jar) est 9.0.2.0.0 J'ai maintenant essayé:

  • Version ojdbc14.jar 10.2.0.4.0
  • Version ojdbc6.jar 11.2.0.1.0
Était-ce utile?

La solution

J'ai trouvé un travail autour de ce problème. La question elle-même semble tourner autour du fait que Netbeans 6.5 (et versions ultérieures I jusqu'à ce point) ne vous permet pas de reverse engineering d'une base de données à partir d'un fichier existant hibernate.reveng.xml. Ceci est prévu pour être disponible dans la version 7.

Le travail autour j'ai trouvé est de créer une tâche de fourmi pour recréer les fichiers java hbm.xml et POJO. J'ai actuellement ce crochu arriver quand je fais un nettoyage et construire, mais je vais essayer de trouver un moyen de l'avoir complètement séparé, car il ne doit être exécuté lorsque les modifications du schéma de base de données.

Pour cela quand vous faites un nettoyage et de construire si vous devez modifier votre fichier build.xml.

La première partie est les bibliothèques dont vous aurez besoin. Donc ajouter:

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

Vous devriez déjà avoir la mise en veille prolongée-tools.jar, hibernate3.jar et fichiers ojdbc14.jar sur votre machine. Il suffit donc de changer le chemin pour eux. freemaker.jar et JTidy-r938.jar devra être téléchargé, comme je n'ai pas celles-ci.

En dessous du build.xml vous devrez ajouter:

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

La dernière section, vous aurez besoin est l'ensemble de fonctionner dans la section post-propre:

<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 partie de suppression supprimera les fichiers existants HBM et POJO, avant qu'ils ne soient recréés.
  • Les points de configurationfile à votre fichier de configuration principale.
  • Le nom du package est le point package séparé que vous voulez qu'ils ont créé dans (com.stackoverflow.pojo par exemple).
  • Le revengfile est le fichier xml d'ingénierie inverse à utiliser lors de la création des fichiers HBM et POJO.
  • Le hbm2hbmxml va créer les fichiers hbm.xml de vos tables.
  • Le hbm2java va créer les fichiers POJO java de vos tables.

Maintenant, pour obtenir l'Oracle Horodatage pour être autre chose que Serializable, modifiez le fichier hibernate.reveng.xml et ajouter:

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

juste après la balise schéma de sélection.

Alors un environnement propre et construire et les horodateurs ne seront pas java.sql.Timestamp au lieu des objets Serializable.

Ceci est une longue réponse que je sais, mais cela devrait également fonctionner pour tout autre changement que vous devez définir dans le fichier hibernate.reveng.xml (je pense). Je ne suis pas expert en veille prolongée, de sorte que votre kilométrage peut varier avec cela.

Mise à jour: Ainsi, après quelques googler j'ai trouvé ce Site sur les tâches de fourmi personnalisé dans Netbeans. Donc, j'ai simplement changé le nom de la cible à gen-dao et maintenant il ne fonctionne pas à chaque fois que je fais un nettoyage et construire, juste au moment où j'invoque spécifiquement.

Autres conseils

Je fait face à la même question et résolu en écrivant mon RevengNamingStrategy.

  

J'ai une table avec deux colonnes comme TIMESTAMP_WITH_TIMEZONE et   TIMESTAMP_WITH_LOCAL_TIMEZONE et processus d'ingénierie inverse de leur   sont en correspondance à seralizable.

SqlTypes des types de TIMESTAMP_WITH_TIMEZONE et TIMESTAMP_WITH_LOCAL_TIMEZONE sont -101 et -102.And Comme il n'y a aucun type de mapping hibernate java.sql.Types pour ces types, d'où ils cartographient à seralizable.

A écrit mon propre RevengNamingStrategy, qui convertit ce type de stagiaire Timestamp.Which se transforme en mise en veille prolongée 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;
    }

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top