如何在oibernate中将oracle timestamp映射到适当的java类型?

我是新来的冬眠,我很难过。 在我的数据库中,我有一些列有TIMESTAMP(6) 。 我正在使用Netbeans 6.5.1,当我生成hibernate.reveng.xmlhbm.xml filespojo 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; } }