java - Hibernate 不会通过合并或更新来更新实体

标签 java spring hibernate

我有 User 和 UserRole 类。我想从用户中删除角色并更新它。

这是我的deleteRole方法:

public void deleteRole(String username, String role) {
     User user = userDao.findByUserName(username);
            Set<UserRole> userRoles = user.getUserRole();
            for (UserRole tempRole: userRoles) {
                if (tempRole.getRole().equals(role)){
                    userRoles.remove(tempRole);
                }
            }
            user.setUserRole(userRoles);
      updateUser(user);
}

这是我的 updateUser 方法:

 public void update(User user) {
       sessionFactory.getCurrentSession().merge(user);
    }

我尝试了更新、合并、saveOrUpdate,但没有任何变化。我仍然拥有所有相同的角色。

用户实体

@Entity
@Table(name = "USERS")
public class User {
    @Id
    @Column(name = "USERNAME", nullable = false, unique = true)
    private String username;

@Column(name = "PASSWORD", nullable = false)
private String password;

@Transient
private String confirmPassword;

@Column(name = "ENABLED", nullable = false)
private boolean enabled = true;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.EAGER)
private Set<UserRole> userRole = new HashSet<>();

这是 userRole 实体

@Entity
@Table(name = "USER_ROLES", uniqueConstraints = @UniqueConstraint(
        columnNames = { "ROLE", "USERNAME" }))
public class UserRole {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "user_role_id",
            unique = true, nullable = false)
    private Integer userRoleId;

    @Column(name = "ROLE")
    private String role;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "USERNAME")
    private User user;

更新 当我从用户中删除角色并合并它,然后尝试从基础获取 userByUsername 时,它​​显示该用户没有此角色,但是当我尝试用用户打开我的 html 页面时,它会再次出现在列表中。

最佳答案

详细阐述我之前的评论 - 我认为您已将 UserRole 定义为关系的所有者(未使用mappedBy 属性注释的所有者!),因此在 UserRole 处设置用户而不是在 User 处设置 UserRole 可能会解决这个问题。 尝试为所需的 userRole 设置用户成员,而不是相反。

    public void deleteRole(String username, String role) {
    User user = userDao.findByUserName(username);
    Set<UserRole> userRoles = user.getUserRole();
    for (UserRole tempRole: userRoles) {
        if (tempRole.getRole().equals(role)){
            tempRole.setUser(null);
            sessionFactory.getCurrentSession().merge(tempRole);
        }
    }
}

关于java - Hibernate 不会通过合并或更新来更新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55793203/

相关文章:

Java 11 HTTP 客户端自定义执行器线程池大小

spring - 如何在 spring mvc 表单中验证多个模型?

java - 如何在 Spring Boot 9 :30 am to 4:00 pm every 5 mins? 之间运行作业

hibernate - 无法配置 Jasypt + Hibernate

java - 在 Seam 3/Hibernate 中对实体的更改不会刷新到 DB

java - 线程池通信

java - Spring中有哪些获取ApplicationContext对象的方法?

Java并发,在父线程中访问socket

java - 在 Spring Boot 应用程序初始化之前寻找一种解析 spring boot application.yml 文件中的值的方法

java - 未找到映射(资源)