I got the UserDetails
entity form database and passed it as model attribute (MVC). Later, I tried to update the updated UserDetails
entity in database.
Now I am getting this error.
My doubts are
- What is the use case of
CascadeType.MERGE
- How Hibernate handles entities
- How can I update existing entity which is associated with another entity.
Multiple representations of the same entity [com.rajath.instagram.entity.UserDetails#1] are being merged. Managed: [com.rajath.instagram.entity.UserDetails@637bce04]; Detached: [com.rajath.instagram.entity.UserDetails@2b6247fa]; nested exception is java.lang.IllegalStateException: Multiple representations of the same entity [com.rajath.instagram.entity.UserDetails#1] are being merged. Managed: [com.rajath.instagram.entity.UserDetails@637bce04]; Detached: [com.rajath.instagram.entity.UserDetails@2b6247fa]] with root cause java.lang.IllegalStateException: Multiple representations of the same entity [com.rajath.instagram.entity.UserDetails#1] are being merged. Managed: [com.rajath.instagram.entity.UserDetails@637bce04]; Detached: [com.rajath.instagram.entity.UserDetails@2b6247fa]
Controller Layer:
@PostMapping("/addUserDetails")
public String adduserDetails(@ModelAttribute("user") UserDetails userDetails) {
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
regisrationService.updateUserDetails(user.getUsername(), userDetails);
return "redirect:/register/addProfilePhoto";
}
Service Layer:
@Override
@Transactional
public void updateUserDetails(String username, UserDetails userDetails) {
Optional<InstagramUser> opt = instagramUserJpaDao.findById(username);
InstagramUser user = opt.get();
userDetails.setUser(user);
userDetailsJpaDao.saveAndFlush(userDetails);
}
Dao Layer:
@Override
public void updateUserDetails(String username, UserDetails userDetails) {
Session session = manager.unwrap(Session.class);
InstagramUser user = session.get(InstagramUser.class, username);
userDetails.setUser(user);
user.setUserDetails(userDetails);
session.saveOrUpdate(userDetails);
}
My entities are:
- Instagramuser
// From user details table
@OneToOne(mappedBy="user", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
private UserDetails userDetails;
- UserDetails
// From user table, @OneToOne matching because, only one user details entry for a user
@OneToOne(fetch=FetchType.EAGER,
cascade= {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name="username")
private InstagramUser user;