多个数据库的休眠自动增量字段

Posted

技术标签:

【中文标题】多个数据库的休眠自动增量字段【英文标题】:Hibernate auto increment field for multiple databases 【发布时间】:2011-03-06 20:14:47 【问题描述】:

我有一个 Java 对象,其中包含一个需要在数据库中自动递增的字段。该字段不是主键,只是需要自增的字段。

我的问题是在执行 session.save(Object) 之前,我需要在我的 Java 对象中设置这个字段的值是多少?我必须将其设置为 NULL 吗?

Hibernate 映射将如何查找此字段?这是我所拥有的,但它不起作用:

<property name="reportNum" type="java.lang.Long">
 <column name="REPORTNUM"/>
 <generator class="increment"/>
</property>

应用程序还需要同时支持 mysql 和 SQL Server。

提前致谢。

【问题讨论】:

【参考方案1】:

我会尽量让它尽可能简单,只需用 insert=false, update=false 属性标记属性。在将 @Generated 注释与命名查询一起使用之前,我遇到了麻烦,但 insert/update=false 一直像宣传的那样工作。

【讨论】:

【参考方案2】:

您不能将&lt;generator&gt; 用于非id 字段。我可以在这里想到两种可能的解决方案。

选项 1

拥有由数据库生成的属性(使用自动增量列1 或触发器)并将其映射为生成的属性(参见5.6. Generated properties):

<property name="reportNum" type="java.lang.Long" generated="insert">
  <column name="REPORTNUM"/>
</property>

这告诉 Hibernate 给定的属性值是在插入时生成的(Hibernate 会在插入后读取它来为实体赋值)。

选项 2

创建一个只有 ID 属性的实体。当您需要一个新值时,您只需创建一个新实例并将其保存到数据库中。然后,您在实体中设置生成的 ID。

1 免责声明:我没有检查这是否适用于非 pk 列。

【讨论】:

感谢您指出 generate="insert" 属性。我会将它包含在我的休眠映射文件中。

以上是关于多个数据库的休眠自动增量字段的主要内容,如果未能解决你的问题,请参考以下文章

休眠(mysql)刷新与提交中的自动增量

休眠自动增量 MySQL

hibernate - 如何在 mysql 和 oracle 数据库中设置自动增量?

休眠自动增量

如何在ms访问中重置自动增量字段[重复]

使用休眠注释自动递增和用户定义的 id