Search code examples
hibernatejpajpql

Database is not updating after merging


I am trying to update and merge new data in the same row of database using userID. My code is running smoothly and there are no errors but after setting values my database don't get updated. How should i GET my updated values into my database table? I am stuck.. please help me

This is the piece of code that i am trying to run. First i match NIC number to get userID from table and then set new values for that ID

/XHrUserDao Class Code/

public Integer findPersonXHrUserId(String nic)
    {
      Query query = em.createQuery("select u.userId from XHrUser u where (u.nic) = (:nic)")
              .setParameter("nic", nic);
      List<Integer> list = query.getResultList();
      return list.isEmpty() || list.get(0) == null ? 0 : list.get(0);
    }


    public void UpdateUserInDbTable(String firstName, String lastName, String nic, String phoneNumber, String emailAddress) {

        int userId = findPersonXHrUserId(nic);
        XHrUser xHrUserObj= new XHrUser();

        xHrUserObj.setUserId(userId);
        xHrUserObj.setFirstName(firstName);
        xHrUserObj.setLastName(lastName);
        xHrUserObj.setNic(nic);
        xHrUserObj.setPhone(phoneNumber);
        xHrUserObj.setEmail(emailAddress);


        xHrUserObj= em.find(XHrUser.class, xHrUserObj.getUserId());     

        em.merge(xHrUserObj);
        em.flush();
        em.refresh(xHrUserObj);

    }

/XHrUser Class Code/

package hr;
import java.io.Serializable;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;


@Entity     //tells that its an entity class

@Table(name = "x_hr_user")  //specify the name of the db table to be used 

public class XHrUser implements Serializable {


private static final long serialVersionUID = 1L;

 @Id    //indicating its the primary key of the table
 @Basic(optional = false)

 @Column(name = "user_id")
 private Integer userId;


 @Column(name = "first_name")
 private String firstName;


 @Column(name = "last_name")
 private String lastName;


 @Column(name = "nic")
 private String nic;


 @Column(name = "phone")
 private String phone;


 @Column(name = "email")
 private String email;


public XHrUser() {

 }

public Integer getUserId() {
    return userId;
}

public void setUserId(Integer userId) {
    this.userId = userId;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getNic() {
    return nic;
}

public void setNic(String nic) {
    this.nic = nic;
}

public String getPhone() {
    return phone;
}

public void setPhone(String phone) {
    this.phone = phone;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
    }

 }

/UserService Class/

package hr;

import java.io.Serializable;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

@Stateless
public class UserService implements Serializable {

 private static final long serialVersionUID = 1L;

 @EJB
 private XHrUserDao userDao;

 public void UpdateUser(String firstName,String lastName,String nic,String phoneNumber, String emailAddress)
 {
     userDao.UpdateUserInDbTable(firstName, lastName, nic,phoneNumber,emailAddress);
 }

}

/Backing Class/ /It takes data from user and pass it to Service Class/

package hr;

import java.io.Serializable;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;


@ManagedBean
@RequestScoped
public class GetUpdatedUserBacking implements Serializable {

    private static final long serialVersionUID = 1L;

    private String firstName;
    private String lastName;
    private String nic;
    private String phoneNumber;
    private String emailAddress;

    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getNic() {
        return nic;
    }
    public void setNic(String nic) {
        this.nic = nic;
    }
    public String getPhoneNumber() {
        return phoneNumber;
    }
    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
    public String getEmailAddress() {
        return emailAddress;
    }
    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    @EJB
    private UserService userService;
    public GetUpdatedUserBacking () {

    }
    public String UpdatingInfor()
    {
        String response;
        UpdateUserInformation(firstName, lastName, nic,phoneNumber,emailAddress);
        response="ViewUpdatedDetails.xhtml";

        return(response);
    }
    public void UpdateUserInformation(String firstName,String lastName,String nic,String phoneNumber, String emailAddress){
        userService.UpdateUser(firstName, lastName, nic,phoneNumber,emailAddress);
        }


}

Solution

  • em.find() is getting you the state from the DB and is replacing the User object you created and updated with setters. Try first getting the entity from the database, then update it via the setters (no need to change the id) and merge it.

        int userId = findPersonXHrUserId(nic);
        XHrUser xHrUserObj= em.find(XHrUser.class, userId); 
    
        xHrUserObj.setFirstName(firstName);
        xHrUserObj.setLastName(lastName);
        xHrUserObj.setNic(nic);
        xHrUserObj.setPhone(phoneNumber);
        xHrUserObj.setEmail(emailAddress);
    
        em.merge(xHrUserObj);
        em.flush();
        em.refresh(xHrUserObj);