首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate在使用uuid时生成重复的主键。

Hibernate在使用uuid时生成重复的主键。
EN

Stack Overflow用户
提问于 2016-06-09 12:52:41
回答 1查看 609关注 0票数 0

我遇到了一个问题,hibernate多次存储相同的键。例如,假设我有一个主键为“堆栈溢出”的对象。我使用相同的主键“堆栈溢出”创建另一个对象,hibernate将保存两个对象,每个对象都有自己的记录。我个人认为这是由uuid造成的,因为“堆栈溢出”不会出现在数据库中两次,但是每个对象的唯一uuid是不同的。如何修复为字符串生成不同的uuid?

用户类,电子邮件字段按预期工作,不允许重复电子邮件。

代码语言:javascript
复制
@Entity
@Table(name = "Users")
public class User {

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    private String username;

    @Column(unique = true)
    private String email;

    private String password;
    private String firstName;
    private String lastName;

    // Getters and Setters

表数据

代码语言:javascript
复制
+--------------------------------------+-------------------------+-----------+----------+----------+
| username                             | email                   | firstName | lastName | password |
+--------------------------------------+-------------------------+-----------+----------+----------+
| 2afcb68b-e7e2-4b7d-bb8e-c886b34092aa | -----@yahoo.com         | charlie   | sexton   | sexton   |
| 365a64b0-e036-4654-ad3a-afe2440f5b37 | ton@yahoo.com           | charlie   | sexton   | sexton   |
| 9f9c89f5-7fba-4600-bb86-951c64d9988e | seeeexxxxxxon@yahoo.com | charlie   | sexton   | sexton   |
| a27c5ab7-c651-4027-8a89-0eb516930b31 | sexon@yahoo.com         | charlie   | sexton   | sexton   |
| f7252552-f54b-453a-9806-2d2e4fd40f43 | ----------@yahoo.com    | charlie   | sexton   | sexton   |
+--------------------------------------+-------------------------+-----------+----------+----------+

用于创建data....So的代码数据库中的前三个条目是正确的。所以我所做的就是运行下面的代码一次来生成前三条记录。然后,为了获得最后两条记录,我删除了session.save(用户);然后在第二次运行时更改了user2和user3的电子邮件地址。在第二次运行时,我完全没有接触user2或user3的用户名字段,为什么hibernate允许这样做呢?我是比较新的冬眠,找不到和资源。谷歌的上帝对我不好。

代码语言:javascript
复制
User user = new User();
user.setUsername("charles");
user.setPassword("sexton");
user.setFirstName("charlie");
user.setLastName("sexton");
user.setEmail("ton@yahoo.com");

User user2 = new User();
user2.setUsername("cs");
user2.setPassword("sexton");
user2.setFirstName("charlie");
user2.setLastName("sexton");
user2.setEmail("sexon@yahoo.com");

User user3 = new User();
user3.setUsername("cs");
user3.setPassword("sexton");
user3.setFirstName("charlie");
user3.setLastName("sexton");
user3.setEmail("-----@yahoo.com");

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();

session.save(user);
session.save(user2);
session.save(user3);

List<Expense> listReport = query.list();

session.getTransaction().commit();

session.close();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-09 14:57:10

我认为这是因为您生成了UUID,而不是从您的用户名生成UUID

我用我的代码测试了这个:

代码语言:javascript
复制
package nl.testing.startingpoint;

import java.io.IOException;
import java.util.UUID;

public class Main {

    public static void main(String args[]) throws IOException{
        String a = "stack Overflow";
        String b = "stack Overflow";

        System.out.println(UUID.nameUUIDFromBytes(a.getBytes()).toString());
        System.out.println(UUID.nameUUIDFromBytes(b.getBytes()).toString());

        System.out.println(UUID.nameUUIDFromBytes(a.getBytes()).toString());
        System.out.println(UUID.nameUUIDFromBytes(b.getBytes()).toString());
    }
}

这就是结果:

代码语言:javascript
复制
e6b8789f-8fac-3c40-94ae-6f2fe4b009fc
e6b8789f-8fac-3c40-94ae-6f2fe4b009fc
e6b8789f-8fac-3c40-94ae-6f2fe4b009fc
e6b8789f-8fac-3c40-94ae-6f2fe4b009fc

但是因为你用注解

代码语言:javascript
复制
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")

字符串用户名被hibernate生成的UUID覆盖。相反,我认为您应该从传递到构造函数的字符串中创建一个UUID。

注:我没有测试后者,这是一个假设!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37726563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档