Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring MVC中自动生成唯一的随机字符串+;冬眠 背景_Java_Spring_Hibernate_Jpa_Uuid - Fatal编程技术网

Java 在Spring MVC中自动生成唯一的随机字符串+;冬眠 背景

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

我正在使用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 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生成器来解决这个问题

(附注)
  • 我实际上不确定是否应该强制执行唯一性。我想让每个秘密都是唯一的(理论上)可以创建一个额外的安全层,这让我:
  • 我意识到UUID冲突的概率非常低,所以UUID生成确保了概率意义上的唯一性,但是我真的可以(或者应该)确定它吗

  • 我以前遇到过这样的问题,过了一段时间我意识到是我的数据库表导致了这个问题。这可能与您遇到的问题相同

    对于项目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
    方法;这是最接近我想要的。