Java 在Spring MVC中自动生成唯一的随机字符串+;冬眠 背景
我正在使用SpringMVC(frameworkV4.0.6.RELEASE,JPAV1.6.2.RELEASE)和Hibernate(CoreV4.3.6.FINAL,JPAAPI v2.1)编写一个项目。在我的项目中,有称为“项目”的实体。每个项目都有其唯一的、自动生成的ID作为主键。此ID由以下代码生成:Java 在Spring MVC中自动生成唯一的随机字符串+;冬眠 背景,java,spring,hibernate,jpa,uuid,Java,Spring,Hibernate,Jpa,Uuid,我正在使用SpringMVC(frameworkV4.0.6.RELEASE,JPAV1.6.2.RELEASE)和Hibernate(CoreV4.3.6.FINAL,JPAAPI v2.1)编写一个项目。在我的项目中,有称为“项目”的实体。每个项目都有其唯一的、自动生成的ID作为主键。此ID由以下代码生成: @Id @Column(name = "project_id") @GeneratedValue(strategy = GenerationType.AUTO) private Long
@Id
@Column(name = "project_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long projectId;
此代码按预期工作,并自动创建唯一ID
问题
每个项目都应该有一个随机的、唯一的“秘密”字符串,就像Facebook、Twitter等API提供商分配的字符串一样。因此,为了实现这一点,我尝试使用以下代码,如Hibernate文档所示:
@Column(name = "project_secret", nullable = false, unique = true)
@GenericGenerator(name = "uuid-gen", strategy = "uuid")
@GeneratedValue(generator = "uuid-gen")
private String projectSecret;
然而,每当我尝试创建一个新的项目实体时,我都会遇到一个根本原因如下的org.springframework.dao.DataIntegrityViolationException
:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
列“project\u secret”不能为空
这应该由Hibernate在创建时自动生成,必须是随机的和唯一的1。一个128位的UUID对我来说已经足够了(32个字符,带破折号),我读到Hibernate有一个UUID生成器,所以这就是我想要使用的
进一步资料
在搜索了几个小时后,我再也无法用我想要的方式解决它了。我找到了一个可能的解决方案,包括:
@PrePersist
private void generateSecret(){
this.setProjectSecret(UUID.randomUUID().toString());
}
在项目实体类中。插入此方法时(并且删除@GenericGenerator
&@GeneratedValue
标记),正确生成并插入项目机密;系统按预期工作;没有抛出异常。然而,(我相信)这并不能确保唯一性2,而只是在插入重复机密时导致异常。我希望确保唯一性,最好使用内置的Hibernate生成器来解决这个问题
(附注)
我以前遇到过这样的问题,过了一段时间我意识到是我的数据库表导致了这个问题。这可能与您遇到的问题相同 对于项目id,请确保在数据库中创建该列时使用以下命令
GENERATED ALWAYS AS IDENTITY
我希望这是同样的问题,这将有助于你。还建议使用uuid2作为您的策略
看这里
编辑
在意识到project_secret不是@id字段之后,答案是hibernate不支持在除@id字段之外的任何列上生成值。
有关更多详细信息,请参见此处:UUID复制非常罕见。。阅读此@Orion感谢您抽出时间。这是我在质疑我在DB级别的“独特性”要求时遇到的一个链接,我意识到这是有争议的。但是,正如我所说的,尽管我意识到UUID冲突的可能性非常小,但我想确保唯一性。将来,我可能会对UUID以外的东西有类似的要求,我想学习正确的方法。我真的不想弄乱SQL,因为我使用Hibernate不接触SQL。然而,如果我想在我的DDL中包含它,我如何以编程方式插入它?另外,为了澄清,我在主键/ID生成方面没有问题,所以生成“AS-IDENTITY”不适用于我的问题吗?您使用的是什么类型的数据库?它是在内存中还是一直存在?抱歉,我刚刚注意到project_secret不是@id字段,所以我更新了我的答案,并说明了问题的真正原因:-/这回答了我的问题。非常感谢你。我将使用
@PrePersist
方法;这是最接近我想要的。