Pregunta

Soy nuevo en hibernación y estoy perplejo. En mi base de datos tengo tablas que tienen unas columnas de TIMESTAMP(6). Estoy usando Netbeans 6.5.1 y cuando el genero hibernate.reveng.xml, hbm.xml files y pojo files En él se establecen las columnas a ser de tipo Serializable. Esto no es lo que esperaba, ni lo que quieren que sean.

este publicar en los foros de hibernación diciendo a colocar:

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

en el archivo hibernate.reveng.xml.

En Netbeans no son capaces de generar las asignaciones de este archivo (se crea una nueva cada vez) y no parece tener la capacidad de volver a generarlos a partir del archivo o bien (al menos según este que está programado para estar disponible en la versión 7).

Así que estoy tratando de averiguar qué hacer. Estoy más inclinado a creer que estoy haciendo algo mal ya que soy nuevo en esto, y parece que sería un problema común para los demás.

  • Entonces, ¿qué estoy haciendo mal?
  • Si no estoy haciendo nada malo, ¿cómo puedo solucionar este?

estoy usando Netbeans 6.5, Oracle 10G, y creo que Hibernate 3 (que venía con mis netbeans).

Editar querido decir que encontré esta cuestión stackoverflow, pero en realidad es un problema diferente.

ACTUALIZACIÓN: El controlador JDBC de Oracle que estaba usando (ojdbc14.jar) es 9.0.2.0.0 Ahora también he intentado:

  • ojdbc14.jar versión 10.2.0.4.0
  • ojdbc6.jar versión 11.2.0.1.0
¿Fue útil?

Solución

He encontrado una solución alternativa para este problema. La cuestión en sí parece girar en torno al hecho de que Netbeans 6.5 (y versiones posteriores hasta este punto) no permiten realizar ingeniería inversa una base de datos de un archivo existente hibernate.reveng.xml. Esto está programado para estar disponible en la versión 7.

El trabajo en torno a que he encontrado es para crear una tarea de hormiga para volver a crear los archivos de Java hbm.xml y POJO. Actualmente tengo esta enganchado a suceder cuando hago una limpieza y construcción, pero voy a tratar de encontrar una manera de tenerlo completamente independiente, ya que sólo tendrá que ser corrió cuando los cambios en el esquema de base de datos.

Para lograr esto cuando se hace una limpieza y construcción, aunque es necesario editar el archivo de build.xml.

La primera parte es las bibliotecas que va a necesitar. Así que añadir:

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

Usted ya debe tener la hibernación-tools.jar, hibernate3.jar y archivos ojdbc14.jar en su máquina. Por lo que sólo cambie la ruta a ellos. El freemaker.jar y necesitará JTidy-r938.jar para ser descargado, ya que no tengo esos.

Por debajo de este en el build.xml tendrá que añadir:

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

La última sección que se necesita es el conjunto para ejecutarse en la sección posterior a la limpieza:

<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 porción de borrar borrará los archivos de HBM y POJO existentes, antes de que se vuelven a crear.
  • Los configurationfile puntos a su archivo de configuración principal.
  • El nombre del paquete es el punto separado del paquete que usted quiere que crean en (com.stackoverflow.pojo por ejemplo).
  • El revengfile es el archivo XML de ingeniería inversa para utilizar al crear los archivos de HBM y POJO.
  • El hbm2hbmxml creará los archivos hbm.xml de sus tablas.
  • El hbm2java va a crear los archivos de Java POJO de sus tablas.

Ahora para obtener el Oracle marcas de tiempo para ser algo más que Serializable, editar el archivo hibernate.reveng.xml y añadir:

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

justo después de la etiqueta de selección de esquema.

Así que una limpieza y construcción y las marcas de tiempo no serán java.sql.Timestamp en lugar de objetos Serializable.

Esta es una respuesta larga lo sé, pero esto también debería funcionar para cualquier otro cambio que usted tendría que configurar en el archivo hibernate.reveng.xml (creo). No soy experto en hibernación, por lo que su experiencia puede variar con esto.

ACTUALIZACIÓN: Así que después de algunas google he encontrado este sitio acerca de las tareas de hormigas personalizados en Netbeans. Por lo que simplemente cambió el nombre del objetivo que se gen-dao y ahora no se ejecuta cada vez que hago una limpieza y construcción, justo cuando específicamente invocarlo.

Otros consejos

Me enfrenté problema similar y decidí que al escribir mi propia RevengNamingStrategy.

  

Tengo una tabla con dos columnas como TIMESTAMP_WITH_TIMEZONE y   TIMESTAMP_WITH_LOCAL_TIMEZONE y en el proceso de ingeniería inversa se   está correlacionando con seralizable.

sqltypes de TIMESTAMP_WITH_TIMEZONE y TIMESTAMP_WITH_LOCAL_TIMEZONE tipos son -101 y -102.And Como no hay tipos de mapeo de hibernación en java.sql.Types para estos tipos, de ahí que está correlacionando con seralizable.

Así que escribí mi propia RevengNamingStrategy, que convierte este tipo de Timestamp.Which pasante se convierte en hibernación 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;
    }

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top