hibernate使用uuid.hex生成一个32位的主键,java API中有生成类似32位String的方法吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate使用uuid.hex生成一个32位的主键,java API中有生成类似32位String的方法吗?相关的知识,希望对你有一定的参考价值。

我现在的项目是用Struts架构的为主的,但是有一部分是用SSH架构的。我现在要在Struts架构里方法里往A表新增数据,A表的数据还要被SSH的程序调用。所以就想生成主键的时候用一个类似hibernate这种32位的逻辑主键,有办法完成吗?不要说用时间戳+随机数这类的方法,谢谢!

有的:
String uuid = java.util.UUID.randomUUID().toString();这样就随机生成一个这样的字符串
例如:c9028fda-dba3-4209-9616-1781e8f20258
可以去掉之间的“-”符号
uuid = uuid.replaceAll("-", "");
希望对你有帮助追问

这个方法没问题,但是项目用的JDK1.4,这个功能是JDK1.5以上才有的,还有解决方法吗?

追答

哦 不好意思,我只记得这个哦

参考技术A java UUID是根据时间,网卡,一个随机数的来的,jdk1.4没有,可以找个包,或者自己封装一个 参考技术B 你可以自己生成一个唯一的标识,
获取当前时间 年月日时分秒然后在加一些标识唯一就好了.不一定要32位吧.

Hibernate通过将前一个递增100来生成下一个序列号

我正在编写一个JPA实体,并希望它的id由Hibernate自动生成。我正在使用@GenericGenerator注释以及一些管理策略和增量的参数。我希望生成id(1,2,3,4,...),但不知怎的,Hibernate决定必须通过将前一个id递增100(1,101,201,...)来生成它。顺便说一下,我正在使用Derby Embedded。

我发现strategy =“increment”符合我的目标,但据我所知,它的类型不是线程安全的。

@Table(name = "ACCOUNTS")
data class Account(
        @Id
        @GenericGenerator(name = "ACCOUNT_SEQ",
                strategy = "enhanced-sequence",
                parameters = [
                    Parameter(name = "initial_value", value = "1"),
                    Parameter(name = "increment_size", value = "1")]
        )
        @GeneratedValue(generator = "ACCOUNT_SEQ")
        @Column(name = "ID")
        val id: Long
)

那么,我如何使用strategy =“enhanced-sequence”并将id增加1?可能吗?

答案

您需要检查数据库序列INCREMENT BYin your database值。 Hibernate只从数据库中请求下一个序列值。然后,数据库按配置步长(在您的情况下为100)递增它并返回新值。

在我解释Hibernate的increment_size参数之前,请看一下我在@GeneratedValue(strategy = GenerationType.SEQUENCE)this article中解释的this video。告诉Hibernate使用数据库序列生成主键是一种更简单的方法。

increment_size配置的@GenericGenerator仅在内部用于减少数据库往返次数。它必须与为数据库序列配置的相同。配置好的increment_size告诉Hibernate在必须从序列中获取另一个值之前,它在内部增加检索到的序列值的频率。这是一个快速示例,说明如果将increment_size设置为5会发生什么:

  • 实体:Hibernate从数据库中检索新的序列值。数据库返回1并将其内部值增加5. --- Hibernate使用的值:1数据库中的值:6
  • 实体:Hibernate在内部递增id值--- Hibernate使用的值:2数据库中的值:6
  • 实体:Hibernate在内部递增id值--- Hibernate使用的值:3数据库中的值:6
  • 实体:Hibernate在内部递增id值--- Hibernate使用的值:数据库中的34Value:6
  • 实体:Hibernate在内部递增id值--- Hibernate使用的值:5数据库中的值:6
  • 实体:Hibernate从数据库中检索下一个序列值。数据库返回6并将其内部值增加5. --- Hibernate使用的值:6数据库中的值:11
另一答案

感谢这个答案https://stackoverflow.com/a/31804619/9161059。如果Derby db终止,则自动增量默认情况下会增加100。以下是preallocator的解释:https://db.apache.org/derby/docs/10.9/ref/rrefproperpreallocator.html

以上是关于hibernate使用uuid.hex生成一个32位的主键,java API中有生成类似32位String的方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

hibernate手动设置的id无效的原因与解决方法

hibernate中的主键生成策略

hibernate中的主键生成策略

ibeacon UUID

hibernate JPA:可选值生成

Hibernate 之主键生成策略小总结