如何在oibernate中将oracle timestamp映射到适当的java类型?
我是新来的冬眠,我很难过。 在我的数据库中,我有一些列有TIMESTAMP(6)
。 我正在使用Netbeans 6.5.1,当我生成hibernate.reveng.xml
, hbm.xml files
和pojo files
它将列设置为Serializable
类型。 这不是我的预期,也不是我想要的。
我在hibernate论坛上发现这篇post说要放置:
在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
文件。
第一部分是您需要的库。 所以添加:
您应该已经拥有机器上的hibernate-tools.jar,hibernate3.jar和ojdbc14.jar文件。 所以只需改变它们的路径。 需要下载freemaker.jar和jtidy-r938.jar ,因为我没有这些。
在build.xml
下面你需要添加:
您需要的最后一部分是在后清理部分中运行的设置:
- 删除部分将在重新创建之前删除现有的hbm和pojo文件。
- 配置文件指向主配置文件。
- 包名称是您希望它们创建的点分隔包(例如,
com.stackoverflow.pojo
)。 -
revengfile
是在创建hbm和pojo文件时使用的反向工程xml文件。 -
hbm2hbmxml
将创建表的hbm.xml
文件。 -
hbm2java
将创建表的java pojo文件。
现在要使Oracle Timestamps不是Serializable
,编辑hibernate.reveng.xml
文件并添加:
就在架构选择标签之后。
所以一个干净的构建和时间戳将不是java.sql.Timestamp
而不是Serializable
对象。
这是我所知道的一个很长的答案,但这也适用于你必须在hibernate.reveng.xml
文件中设置的任何其他更改(我认为)。 我不是冬眠的专家,所以你的里程可能因此而异。
更新:所以经过一些谷歌搜索我发现这个网站关于Netbeans中的自定义ant任务。 所以我只是简单地将目标的名称更改为gen-dao
,现在每次执行clean和build时它都不会运行,就在我专门调用它时。
我遇到了类似的问题,并通过编写自己的RevengNamingStrategy解决了这个问题。
我有一个表有两列作为TIMESTAMP_WITH_TIMEZONE和TIMESTAMP_WITH_LOCAL_TIMEZONE的表,在逆向工程过程中,它们映射到可串行。
TIMESTAMP_WITH_TIMEZONE和TIMESTAMP_WITH_LOCAL_TIMEZONE类型的SqlTypes是-101和-102.And因为这些类型的java.sql.Types中没有hibernate映射类型,因此它们映射到可序列化。
所以写了我自己的RevengNamingStrategy,它将这些类型转换为Timestamp.Which实习生转换为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; } }