Как сопоставить временную метку oracle с соответствующим типом java в режиме гибернации?

StackOverflow https://stackoverflow.com/questions/2473866

Вопрос

Я новичок в гибернации и в замешательстве.В моей базе данных у меня есть таблицы, в которых есть столбцы TIMESTAMP(6).Я использую Netbeans 6.5.1, и когда я генерирую hibernate.reveng.xml, hbm.xml files, и pojo files он устанавливает, что столбцы должны иметь тип Serializable.Это не то, чего я ожидал, и не то, какими я хочу, чтобы они были.

Я нашел это разместите сообщение на форумах hibernate с просьбой разместить:

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

в hibernate.reveng.xml файл.

В Netbeans вы не можете сгенерировать сопоставления из этого файла (он создает новое каждый раз), и, похоже, у него также нет возможности повторно сгенерировать их из файла (по крайней мере, в соответствии с это планируется, что он будет доступен в версии 7).

Поэтому я пытаюсь понять, что делать.Я более склонен полагать, что делаю что-то неправильно, поскольку я новичок в этом, и кажется, что это было бы обычной проблемой для других.

  • Так что же я делаю не так?
  • Если я не делаю ничего плохого, как мне обойти это?

Я использую Netbeans 6.5, Oracle 10G и, по-моему, Hibernate 3 (он поставляется вместе с моим netbeans).

Редактировать: Хотел сказать, что я нашел это вопрос stackoverflow, но на самом деле это другая проблема.

Обновить: Драйвер Oracle JDBC, которые я использовал (ojdbc14.jar) является 9.0.2.0.0 У меня сейчас тоже пробовал:

  • ojdbc14.jar версия 10.2.0.4.0
  • ojdbc6.jar версия 11.2.0.1.0
Это было полезно?

Решение

Я нашел способ решения этой проблемы.Сама проблема, похоже, связана с тем фактом, что Netbeans 6.5 (и более поздние версии до этого момента) не позволяют вам перепроектировать базу данных из существующей hibernate.reveng.xml файл.Планируется, что это будет доступно в версии 7.

Обходной путь, который я нашел, заключается в создании задачи ant для воссоздания hbm.xml и файлы pojo java.В настоящее время у меня это подключено, когда я выполняю очистку и сборку, но я попытаюсь найти способ сделать это полностью отдельным, поскольку его нужно будет запускать только при изменении схемы базы данных.

Однако для достижения этой цели, когда вы выполняете очистку и сборку, вам необходимо отредактировать build.xml файл.

Первая часть - это библиотеки, которые вам понадобятся.Так что добавляйте:

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

У вас уже должны быть файлы hibernate-tools.jar, hibernate3.jar и ojdbc14.jar на вашем компьютере.Так что просто измените путь к ним.Тот Самый freemaker.jar и jtidy-r938.jar нужно будет скачать, так как у меня их не было.

Ниже, в разделе build.xml вам нужно будет добавить:

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

Последний раздел, который вам понадобится, - это набор для запуска в разделе после очистки:

<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>
  • Часть удаления удалит существующие файлы hbm и pojo до того, как они будут созданы заново.
  • Тот Самый configurationfile указывает на ваш основной файл конфигурации.
  • Имя пакета - это разделенный точками пакет, в котором вы хотите их создать (com.stackoverflow.pojo например).
  • Тот Самый revengfile это XML-файл обратного проектирования для использования при создании файлов hbm и pojo.
  • Тот Самый hbm2hbmxml создаст hbm.xml файлы ваших таблиц.
  • Тот Самый hbm2java создаст java pojo-файлы ваших таблиц.

Теперь, чтобы временные метки Oracle были чем-то иным, чем Serializable, редактировать hibernate.reveng.xml файл и добавление:

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

сразу после тега выбора схемы.

Таким образом, очистки и сборки и временных меток не будет java.sql.Timestamp вместо того, чтобы Serializable Объекты.

Это длинный ответ, я знаю, но это также должно сработать для любых других изменений, которые вам нужно будет установить в hibernate.reveng.xml файл (я думаю).Я не специалист по гибернации, поэтому ваш пробег может варьироваться в зависимости от этого.

Обновить: Итак, после некоторого поиска в Google я нашел это сайт о пользовательских задачах ant в Netbeans.Поэтому я просто изменил название цели на gen-dao и теперь он запускается не каждый раз, когда я выполняю очистку и сборку, а только тогда, когда я специально вызываю его.

Другие советы

Я столкнулся с подобной проблемой и решил ее, написав свою собственную стратегию RevengNamingStrategy.

У меня есть таблица, имеющая два столбца как TIMESTAMP_WITH_TIMEZONE и TIMESTAMP_WITH_LOCAL_TIMEZONE, и в процессе обратного проектирования они сопоставляются с seralizable.

Типами SqlTypes TIMESTAMP_WITH_TIMEZONE и TIMESTAMP_WITH_LOCAL_TIMEZONE являются -101 и -102.И поскольку в hibernate нет типов отображения в java.sql.Типы следовательно, для этих типов они сопоставляются с seralizable.

Поэтому я написал свою собственную RevengNamingStrategy, которая преобразует этот тип в Timestamp.Который intern преобразует в hibernate 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;
    }

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top