首页 > 解决方案 > Spring Data JPA:当同时调用两个存储库保存方法时,Id 增加两倍

问题描述

我想用 Spring Data JPA 注册我的用户。我有这方面的类:Users、Authorities、UsersRepository(interface)、AuthoritiesRepository(interface) 和一个控制器,我从 AutoWired Repositories 调用 save 方法。

我的用户类:

@Entity
public class Users {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String username;
    private String password;

    private int enabled = 1;

    private static Users instance = null;

    public static Users getInstance() {
        if (instance == null) {
            instance = new Users();
        }
        return instance;
    }

    protected Users() {}

    public Users(String username, String password, int enabled) {
        this.username = username;
        this.password = password;
        this.enabled = enabled;
    }

    public int getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }


    public String getPassword() {
        return password;
    }

    public int getEnabled() {
        return enabled;
    }
}

我的权威类:

@Entity
public class Authorities {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String username;
    private String authority;

    protected Authorities() { }

    public Authorities(String username, String authority) {
        this.username = username;
        this.authority = authority;
    }

    public int getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public String getAuthority() {
        return authority;
    }
}

我的 UsersRepository 接口

public interface UsersRepository extends CrudRepository<Users, Integer> {
}

我的 AuthoritiesRepository 接口

public interface AuthoritiesRepository extends CrudRepository<Authorities, Integer> {
}

我的控制器类

@Controller
public class MyController {

    @Autowired
    private UsersRepository usersRepository;

    @Autowired
    private AuthoritiesRepository authoritiesRepository;

    @Autowired
    private ArticleRepository articleRepository;

    @GetMapping("/register")
    public String register(Model model) {
        model.addAttribute("users", Users.getInstance());
        return "register";
    }

    @PostMapping("/register")
    public String registerSubmit(@ModelAttribute Users users) {
        usersRepository.save(users);
        Authorities authority = new Authorities(users.getUsername(), "read");
        AuthoritiesRepository.save(authority);
        return "redirect:/login";
    }
}

我的 register.html

<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Register</title>
</head>
<body>
<h1>Register:</h1>
<form action="#" th:action="@{/register}" th:object="${users}" method="post">
    <p>Username: <input type="text" th:field="*{username}" /></p>
    <p>Password: <input type="password" th:field="*{password}" /></p>
    <input type="hidden" th:field="*{enabled}" />
    <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>
</body>
</html>

我正在使用 Spring-Data-JPA 和 MySQL。例如,当我从注册页面添加新用户时,Id 会增加两次

Id:3 用户名:user1 密码:pass1
Id:5 用户名:user2 密码:pass2
İd:7 用户名:user3 密码:pass3

id 在 authority 表中也增加了两次。我想增加 1 的 id 值。

这个问题是因为我同时调用了不同的保存方法(在 registerSubmit 方法中)但我必须将它保存在一起我无法改变这种行为。

标签: springjpaspring-securityspring-data-jpaspring-data

解决方案


您使用AUTO_INCREMENT代替的解决方案AUTO是一个很好的解决方案,因为它还避免了使用TABLEHibernate默认为 MySQL的低效率。

您可能希望坚持使用基于表或序列的 id,您需要为每个具有此类 id 的表提供专用序列,因为默认情况下它们使用所有相同的序列。

另一方面,您不应该真正关心序列值的连续性,因为无论如何一旦发生回滚,您就会有间隙,避免间隙会给应用程序带来瓶颈


推荐阅读