Hibernate

时间:2018-01-25 21:35:50

标签: java hibernate

我正在使用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;
}

userDAO的

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。”我问同样,我的对象有标识符仍然是它创建新对象而不是更新旧对象。

1 个答案:

答案 0 :(得分:1)

RTFM

save()

  

保留给定的瞬态实例,首先分配生成的标识符。 (或者,如果使用指定的生成器,则使用identifier属性的当前值。)

update()

  

使用给定分离实例的标识符更新持久化实例。如果存在具有相同标识符的持久化实例,则抛出异常。

要点:
保存是为了新事物。 Hibernate根据需要分配一个id 更新适用于旧事物。 Hibernate按原样使用id