Как сопоставить метку времени оракула с соответствующим типом Java в Hibernate? - PullRequest
4 голосов
/ 19 марта 2010

Я новичок в спящем режиме, и я в тупике. В моей базе данных есть таблицы со столбцами 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 вы не можете сгенерировать сопоставления из этого файла (он каждый раз создает новое), и, похоже, он также не может повторно сгенерировать их из файла (по крайней мере, согласно * 1016). * этот он будет доступен в версии 7).

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

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

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

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

UPDATE: Драйвер oracle jdbc, который я использовал (ojdbc14.jar): 9.0.2.0.0 Я сейчас тоже попробовал:

  • ojdbc14.jar версия 10.2.0.4.0
  • ojdbc6.jar версия 11.2.0.1.0

Ответы [ 2 ]

2 голосов
/ 10 июля 2015

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

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

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

Итак, я написал свой собственный RevengNamingStrategy, который преобразует эти типы в метку времени. Какой молодой специалист конвертирует в спящий режим 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;
    }

}
2 голосов
/ 19 марта 2010

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

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

Для достижения этой цели, когда вы выполняете чистку и сборку, хотя вам необходимо отредактировать файл 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 (я думаю). Я не эксперт в спящем режиме, поэтому ваш пробег может варьироваться в зависимости от этого.

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

...