我遇到了一个问题,hibernate多次存储相同的键。例如,假设我有一个主键为“堆栈溢出”的对象。我使用相同的主键“堆栈溢出”创建另一个对象,hibernate将保存两个对象,每个对象都有自己的记录。我个人认为这是由uuid造成的,因为“堆栈溢出”不会出现在数据库中两次,但是每个对象的唯一uuid是不同的。如何修复为字符串生成不同的uuid?
用户类,电子邮件字段按预期工作,不允许重复电子邮件。
@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表数据
+--------------------------------------+-------------------------+-----------+----------+----------+
| 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允许这样做呢?我是比较新的冬眠,找不到和资源。谷歌的上帝对我不好。
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();发布于 2016-06-09 14:57:10
我认为这是因为您生成了UUID,而不是从您的用户名生成UUID
我用我的代码测试了这个:
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());
}
}这就是结果:
e6b8789f-8fac-3c40-94ae-6f2fe4b009fc
e6b8789f-8fac-3c40-94ae-6f2fe4b009fc
e6b8789f-8fac-3c40-94ae-6f2fe4b009fc
e6b8789f-8fac-3c40-94ae-6f2fe4b009fc但是因为你用注解
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")字符串用户名被hibernate生成的UUID覆盖。相反,我认为您应该从传递到构造函数的字符串中创建一个UUID。
注:我没有测试后者,这是一个假设!
https://stackoverflow.com/questions/37726563
复制相似问题