Как сопоставить временную метку oracle с соответствующим типом java в режиме гибернации?
-
21-09-2019 - |
Вопрос
Я новичок в гибернации и в замешательстве.В моей базе данных у меня есть таблицы, в которых есть столбцы 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;
}
}