【问题标题】:Spring Data JPA: Id Increments Twice When Two Repository Save Method Called In Same TimeSpring Data JPA:当同时调用两个存储库保存方法时,Id 增加两倍
【发布时间】:2021-05-24 15:33:38
【问题描述】:

我想用 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;
    }
}

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

我的注册.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 也增加了两倍。 我想增加 1 的 id 值。

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

【问题讨论】:

  • 有人知道吗?我需要帮助吗?
  • 我正在努力解决这个问题大约 5 个小时。我已经尝试过另一代主键策略。我还为此实施了一项服务,但不起作用。我与电报组的人讨论这个问题。没有人能解决这个问题。
  • 我通过将AUTO_INCREMENT赋予所有表并将生成值策略设置为IDENTITY解决了这个问题

标签: spring jpa spring-security spring-data-jpa spring-data


【解决方案1】:

您使用AUTO_INCREMENT 而不是AUTO 的解决方案是一个很好的解决方案,因为它还避免了使用TABLEHibernate defaults to for MySQL 的低效率。

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

另一方面,您不应该真正关心序列值的连续性,因为无论如何一旦发生回滚和avoiding gaps creates a bottleneck on the application,您就会有间隙。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2019-05-14
    • 2017-08-20
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 2014-11-16
    相关资源
    最近更新 更多