如何在hibernate中将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
是创建 hbm 和 pojo 文件时使用的逆向工程 xml 文件。 - 这
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
文件(我认为)。我不是冬眠方面的专家,因此您的情况可能会有所不同。
更新:所以经过一番谷歌搜索后我发现 这 有关 Netbeans 中自定义 ant 任务的站点。所以我只是将目标的名称更改为 gen-dao
现在,它不会在我每次执行清理和构建时运行,只是在我专门调用它时运行。
其他提示
我遇到了类似的问题,并通过编写自己的 RevengNamingStrategy 解决了它。
我有一个表格,有两个列作为timestamp_with_timezone和timestamp_with_local_timezone,以及在反向工程过程中它们映射到可呼吸的。
TIMESTAMP_WITH_TIMEZONE 和 TIMESTAMP_WITH_LOCAL_TIMEZONE 类型的 SqlTypes 为 -101 和 -102。并且由于 中没有 hibernate 映射类型 java.sql.Types 对于这些类型,因此它们映射到可序列化。
所以写了我自己的 RevengNamingStrategy,它将这些类型转换为 Timestamp。Which 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;
}
}