我是冬眠新手,我很困惑。在我的数据库中,我的表包含以下列 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.jarjtidy-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;
    }

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top