java - 更新在 Hibernate 多对多关系表中不起作用

标签 java spring hibernate jpa

我正在尝试设计一个 CRUD Controller ,在这里插入和删除操作工作正常,但更新不起作用。提交更新时,仅更新用户表,不更新角色表。

User.java

@Entity
@Table(name="users")
public class User implements UserDetails {
    @Id
    @GeneratedValue (strategy = GenerationType.AUTO)
    private Long id;

    @Column(length = 128, nullable = false)
    private String firstName; 

    @Column(length = 128, unique = true, nullable = false)
    private String email;                       // required; unique

    @Column(unique = true, nullable = false, length=128)
    private String name;

    @Column(length = 128, nullable = false)
    private String password;                    // required

    @Column
    private boolean enabled;

    @JsonBackReference
    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(
            name = "company_user",
            joinColumns = @JoinColumn(name = "userId"),
            inverseJoinColumns = @JoinColumn(name = "companyId")
    )
    private Set<Company> companies = new HashSet<Company>();

    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE})
    @JoinTable(
            name = "user_role",
            joinColumns = @JoinColumn(name = "userId", referencedColumnName="id"),
            inverseJoinColumns = @JoinColumn(name = "roleId", referencedColumnName="id")
    )
    private Set<Role> roles = new HashSet<Role>();

角色.java

@Entity
public class Role extends BaseObject {
    @Column(length = 64)
    private String description;

UserController.java

@PostMapping("/saveUser")
        public void save(@ModelAttribute User user, BindingResult bindingResult, HttpServletRequest req, HttpServletResponse rsp) throws IOException {

            user.setPassword(new BCryptPasswordEncoder().encode(user.getPassword()));
        //  LOGGER.info("--------------role User ID----------" + user.getRoles());
            user.setRoles(user.getRoles());
            userService.registerUser(user);

            req.setAttribute("users", userService.findAllUsers());
            req.setAttribute("mode", "USER_VIEW");
            rsp.sendRedirect("showUser");
        }


**UserService.Java**


public User registerUser(User user) {
        Optional<User> exists = userRepository.findOneByName(user.getName());
        return exists.isPresent() ? userRepository.save(exists.get().merge(user))
                : userRepository.save(user);
    }

如何克服这种情况?请帮助我......

最佳答案

尝试在此字段上使用cascade = CascadeType.ALL
私有(private) Set 角色 = new HashSet();

我假设您的 isPresent 返回 false 并且 UserRepository.save(user) 正在运行,这将仅保存用户而不是角色,因为您正在使用 cascade = {CascadeType.MERGE} 它可能会解决您的问题。

关于java - 更新在 Hibernate 多对多关系表中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45318068/

相关文章:

java - 如何从 Spring boot 依赖注入(inject)中的对象列表中查找特定的类对象

java - 如何在多项选择 Activity 中更改问题并将分数传递到下一个 Activity

java - 使用 jni : Failed to find static method id 从 C++ 调用 java 函数

java - Spring Security/CXF 抛出 AuthenticationCredentialsNotFoundException : An Authentication object was not found in the SecurityContext

java - @PostContruct 在服务器启动期间给出 NullPointerException

java - 如何使用 Criteria Restriction.like、Hibernate 和 Spring 来设置不同的参数?

Hibernate 查询列表中的项目

java - hql - 获取意外 token 的错误

java - 将当前地址显示为 Toast

java - 在 Spring-MVC 中显示 JSP 页面时出现问题