这是我第一次使用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的映射类型(我自己找不到任何有趣的东西) 感谢
答案 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。