当同时调用两个存储库save方法时,spring数据jpa:id会增加两倍

lf5gs5x2  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(332)

我想用springdatajpa注册我的用户。我有这样的类:users、authorities、usersrepository(interface)、authoritiesrepository(interface)和一个控制器,我从autowired存储库中调用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;
    }
}

我的用户存储界面

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";
    }
}

我的注册表.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数据jpa和mysql。例如,当我从register page.id添加新用户时,会增加两次
编号:3username:user1 password:通过1
编号:5username:user2 password:密码2
我̇d:7分username:user3 password:通过3
身份证在官方表格中也增加了两倍。我想增加1的id值。
这个问题的原因是我在同一时间调用了不同的save方法(在registersubmit方法中),但是我必须将它保存在一起,我不能改变这个行为。

krugob8w

krugob8w1#

您要使用的解决方案 AUTO_INCREMENT 而不是 AUTO 是一个很好的方法,因为它也避免了使用的低效性 TABLE mysql的hibernate默认为哪个。
您可能希望坚持使用基于表或序列的id,您需要为每个具有这样一个id的表提供一个专用的序列,因为默认情况下,它们都使用相同的序列。
另一方面,您不应该真正关心序列值的连续性,因为一旦发生回滚,就会出现间隙,避免间隙会在应用程序上造成瓶颈。

相关问题