是否可以在不使用 ID 的情况下实现自增编号?

2024-01-05

我继续谷歌搜索并发现唯一的方法是使用

@Id
@GeneratedValue(strategy = GenerationType.Identity)

但我已经有一个主键,我只需要另一个自动递增的字段。通过手动计算来编码确实很困难。


我看到以下选项:

1)你可以使用@生成 https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#mapping-generated-Generated注解。

您应该有一个按以下方式声明的表:

create sequence TST_DATA_SEQ increment by 1 start with 1;

create table TST_DATA (
   ...
   dat_auto integer default nextval('TST_DATA_SEQ'),
   ...
);

以及实体中的适当列:

   @Generated(value = GenerationTime.INSERT)
   @Column(name = "dat_auto", insertable = false, updatable = false)
   private Long auto;

请注意,根据文档 https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#mapping-generated:

标记为生成的属性还必须是不可插入和不可更新的。

因此,hibernate 将进行额外的查询来填充auto冲洗后的田地。

   Data data = new Data();
   // filling fields except data.auto
   session.persist(data);
   session.flush();
insert into TST_DATA (dat_name, dat_id) 
values (?, ?)

Hibernate: /* get generated state com.example.hibernate.Data */
  select data_.dat_auto as dat_auto_0_ 
  from TST_DATA data_ 
  where data_.dat_id=?

2)你可以使用@GeneratorType https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#mapping-generated-GeneratorType注解。

你应该有一个 hibernate 的实现ValueGenerator。您可以在下面看到简单的示例。

import java.math.BigInteger;
import org.hibernate.Session;
import org.hibernate.tuple.ValueGenerator;

public class MyGenerator implements ValueGenerator<Long> 
{
   public Long generateValue(Session session, Object owner)
   {
      return (
         (BigInteger) session
            .createNativeQuery("select nextval('TST_DATA_SEQ')")
            .getSingleResult()
         ).longValue();
   }
}

然后你可以像这样使用它:

   @GeneratorType(type = MyGenerator.class, when = GenerationTime.INSERT)
   @Column(name = "dat_auto")
   private Long auto;

在这种情况下,您不应按照 n1 中的要求为列声明提供默认值。并且适当的实体字段不应该有@Column(... insertable = false, updatable = false)。每次持久化该实体时,hibernate 都会生成查询:

select nextval('TST_DATA_SEQ')

并将该值填充到auto field.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在不使用 ID 的情况下实现自增编号? 的相关文章

随机推荐

  • 将 oracle 转储导入到 PostgreSQL

    我有一个纯文本而不是 oracle 二进制转储 我如何将其导入到 postgres 中 有可用的工具吗 或者还有其他的吗 以前有人这样做过吗 我的想法是将一个转储 oracle 转换为另一个转储 postgres 查看ETL工具 http
  • 无法在 Android Oreo 中创建目录(API 26)

    我已经阅读了 Android Oreo 的行为和更改的文档 我知道为 Android Oreo API 26 创建文件目录有不同的过程 Code File mediaStorageDir null if Build VERSION SDK
  • 如何获取带有特定注释的对象的所有字段和属性?

    如何获取使用特定注释进行注释的对象 非类 的所有字段和属性而不进行迭代all它的字段或属性描述符 我的目标是避免对显然没有注释的每个字段或属性进行不必要的迭代 例如 getClass 或不是实例的字段或成员变量的类的任何字段 或者迭代是唯一
  • 无法加载文件或程序集Antlr3.Runtime.dll

    我们使用 TeamCity 作为构建服务器 Net Framework 4 和 ASP NET MVC2 以及 NHibernate 由于最近 Amazon EC2 问题 我们的构建服务器最近离线了 我们正在设置一个新的构建服务器 然而 即
  • 具有 S3 位置的 Tensorboard

    我正在尝试使用 S3 路径tensorboard logdir命令并收到以下错误 tensorflow python framework errors impl UnimplementedError 文件系统方案 s3 未实现 文件 s3
  • 饼图标签被切断

    我正在制作饼图 一些标签被剪掉了 我想缩小情节以容纳所有标签 下面是一个可重现的示例 library plotly plot ly type pie values 1 19 labels c 101 119 textinfo label v
  • 如果表中没有索引,如何配置 NHibernate 映射到数组?

    我有一个现有的 POCO 类库 其中子集合全部存储在数组中 例如 Customer 类有一个 Invoice 数组来保存其发票 class Customer public int ID public Invoice invoices cla
  • 整数宽度与位域声明相关吗?

    我试图找到一个不应该写的理由 struct bitfield signed foo 4 unsigned bar 2 而不是详细指定 struct bitfield signed int foo 4 unsigned int bar 2 由
  • 实现抽象方法时更改参数类型

    是否有某种方法可以将抽象类型定义为抽象方法中的参数 并且当在派生类中实现该方法时 可以更改该方法的类型以接受派生类型 Code public abstract class ProductBase public class SomeProdu
  • 将类似 facebook 的按钮与动态加载的内容集成

    我正在开发的网站包含通过 AJAX 动态加载的项目列表 当您向下滚动页面时 会加载更多项目 现在 我的客户想要为每个项目添加一个类似 Facebook 的按钮 以及喜欢此按钮的人数 集成默认的点赞按钮没有问题 但是如何将点赞按钮添加到通过
  • PackageManager.getComponentEnabledSettings() 在冷启动之间是否持续存在?

    如果我使用下面的代码禁用 AndroidManifest xml 中定义的静态 BroadcastReceiver 它会在重新启动后重新启用吗 似乎不是 但文档没有说明是否应该 final ComponentName compName ne
  • 计算R中表格每一行的线性趋势线

    是否有可能在不使用循环的情况下对数据帧的每一行进行线性回归 趋势线的输出 截距 斜率 应作为新列添加到原始数据框中 为了更清楚地表达我的意图 我准备了一个非常小的数据示例 day1 lt c 1 3 1 day2 lt c 2 2 1 da
  • Python Scrapy 和 Yield

    我目前正在第一次使用 Scrapy 开发爬虫 也是第一次使用 Yield 我仍在努力思考产量问题 刮刀 抓取一页以获取日期列表 解析 使用这些日期来格式化 URL 然后抓取 parse page contents 在此页面上 它找到每个单独
  • 使用 NSURLConnection 的自定义子类,它稍后如何“找到”类中的附加数据?

    这个博客提供了一个很好的解决方案来处理多个 NSURLConnections 创建一个自定义的 CustomURLConnection 类 它有一个额外的tag财产 http blog emmerinc be index php 2009
  • SharePoint 2010 文档库版本注释

    我想强制用户在签入文档之前添加评论 当用户选择签入时 会显示默认的弹出页面 以便选择版本和撰写评论 但评论字段不是必填字段 我们可以将其设为必填字段吗 你可以通过 EventReceiver 来做到这一点 public class Even
  • 使用 .htaccess 删除 .php 并重定向到其非 .php 版本

    我有一个网站 需要删除每个文件的 php 扩展名 然后将指向包含 php 扩展名的任何文件的任何链接重定向到同一文件 但不包含 php 我找到了以下代码 它非常有用 但是文件夹中包含的任何内容都将被重定向到根目录 如下例所示 http ww
  • 如何仅在 div 加载时运行函数?

    我只想在加载 div 时运行函数 当我加载页面时 会加载许多文件 在列表的末尾 PHP 回显一个 div 当显示这个时 jQuery 应该运行一个函数 我可以通过点击事件来完成此操作 但我希望它能够自动工作 而无需按下按钮 单击后 它的工作
  • 尝试了解 Pandoc 如何从 Markdown 转换为 Latex

    如果这是重复的话 我深表歉意 我有一个 Markdown 文件test md https www akshaygaur org test md它有两个乳胶数学模式部分 第一个乳胶块 在 md 文件中 begin flalign P 1
  • VScode:如何更改 HTML 打开和关闭标记的颜色

    如何更改 VScode 中 HTML 打开 关闭标签的颜色以匹配下图 我尝试过使用Highlight Matching Tag扩展名和以下设置 但这仅适用于选择 onFocus 标签 我希望开放标签的实际字体颜色与所有结束标签不同 谢谢你
  • 是否可以在不使用 ID 的情况下实现自增编号?

    我继续谷歌搜索并发现唯一的方法是使用 Id GeneratedValue strategy GenerationType Identity 但我已经有一个主键 我只需要另一个自动递增的字段 通过手动计算来编码确实很困难 我看到以下选项 1