我正在使用jsp / servlet和hibernate开发用户模块。在更新用户时,我使用了在添加新用户时使用的相同保存方法。
public static User updateUserInstance(HttpServletRequest request) {
String id = request.getParameter("userId");
String firstName = request.getParameter("firstName");
String lastName = request.getParameter("lastName");
String userName = request.getParameter("userName");
String gender = request.getParameter("gender");
String dob = request.getParameter("dob");
String email = request.getParameter("email");
String userType = request.getParameter("userType");
User user = getUser(Integer.parseInt(id));
System.out.println("User is : "+user);
user.setFirstName(firstName);
user.setLastName(lastName);
user.setUserName(userName);
user.setGender(gender);
user.setDob(dob);
user.setEmail(email);
user.setUserType(userType);
return user;
}
public boolean saveUser(User user) {
try{
SessionFactory factory = HibernateUtility.getSessionFactory();
Session session = factory.getCurrentSession();
session.beginTransaction();
session.save(user);
session.getTransaction().commit();
return true;
} catch(Exception e) {
System.out.println(e);
return false;
}
}
public boolean updateUser(User user) {
try{
SessionFactory factory = HibernateUtility.getSessionFactory();
Session session = factory.getCurrentSession();
session.beginTransaction();
session.update(user);
session.getTransaction().commit();
return true;
} catch(Exception e) {
System.out.println(e);
return false;
}
}
所以我的服务是根据Id查找用户并更新用户值。之后我使用了相同的userDao保存方法,而不是更新该用户它正在创建新用户。所以我创建了一个名为updateUser的新方法。
我试图找到保存和更新之间的区别,发现如果标识符不存在,save将插入到数据库中,否则会引发错误。虽然在我的情况下它没有显示任何错误和创建新用户。因此,我无法清楚地确定内部保存和更新的工作原理。
What are the differences between the different saving methods in Hibernate?
我的问题完全不同。我想知道同样的,但它明确提到在上面的问题中“保存持有一个实体。如果一个不存在,将分配一个标识符。如果一个,它实质上是在进行更新。返回生成的实体ID。”我问同样,我的对象有标识符仍然是它创建新对象而不是更新旧对象。
答案 0 :(得分:1)
save()
:
保留给定的瞬态实例,首先分配生成的标识符。 (或者,如果使用指定的生成器,则使用identifier属性的当前值。)
update()
:
使用给定分离实例的标识符更新持久化实例。如果存在具有相同标识符的持久化实例,则抛出异常。
要点:
保存是为了新事物。 Hibernate根据需要分配一个id
更新适用于旧事物。 Hibernate按原样使用id