hibernate避免id

时间:2011-09-20 08:42:50

标签: java oracle hibernate hibernate-mapping

这是我第一次使用hibernate,所以请原谅我,如果我要请求简单的建议。
我正在使用xml(没有注释)映射一个类,我没有在我的桌子上有id,但有人告诉我,我有资格使用hibernate使用ID,因此,我在表格中创建了SMS_MONITORING_ID字段,并将其映射如下:

 <class name="smsbox.dal.model.SmsMonitoring" table="MST_SMS_MONITORING">
    <comment></comment>

    <id name="smsMonitoringId" type="long">
        <column name="SMS_MONITORING_ID" />
        <generator class="native" >
            <param name="sequence">ID_SMS_MONITORING</param>
        </generator>

    </id>

我已经在我的oracle数据库上创建了一个序列(ID_SMS_MONITORING),我不希望hibernate完全处理id,我甚至想避免在我的java代码中引用任何id(当我保存时对象)。
如何让hibernate在分配id时忽略整个过程?

PS我正在将id(long)映射到Oracle“Number”类型,避免可能出现的问题的规则是什么(长期不适合数字,反之亦然)任何人都可以为我提供一些解释的链接以及Hibernate和Oracle DB的映射类型(我自己找不到任何有趣的东西) 感谢

3 个答案:

答案 0 :(得分:1)

不幸的是,每个映射实体都应该按照每个关系数据库的要求映射ID。

仅在持久保存对象时才将ID分配给对象,因此您需要在Hibernate中使用序列。除此之外,您需要使用比ID更多的参数创建equals和hashcode函数,因为如果您有两个对象并且它们的ID为null并且您的equals和hashcode函数仅使用ID,则两个对象在Hibernate中是相等的并且可能是导致代码中出现许多问题的根本原因。

答案 1 :(得分:1)

如果您参考Hibernate文档:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-id

你会看到标签是可选的。保留未定义等同于将其设置为“已分配”(换句话说,您的应用程序将处理id分配)。

答案 2 :(得分:0)

您可以尝试将id生成器声明为以下

 <generator class="sequence">
        <param name="sequence">YourSquenceName</param>
      </generator>

当您使用hibernate保存对象时,您不必获取/设置Id,只需将id字段保留为null,Hibernate将从您的序列中获取有效的id。