spring - 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 方法中)但我必须将它保存在一起我无法改变这种行为。
解决方案
您使用AUTO_INCREMENT
代替的解决方案AUTO
是一个很好的解决方案,因为它还避免了使用TABLE
Hibernate默认为 MySQL的低效率。
您可能希望坚持使用基于表或序列的 id,您需要为每个具有此类 id 的表提供专用序列,因为默认情况下它们使用所有相同的序列。
另一方面,您不应该真正关心序列值的连续性,因为无论如何一旦发生回滚,您就会有间隙,避免间隙会给应用程序带来瓶颈。
推荐阅读
- java - 有没有办法在您自己的应用程序上复制 Google 地图的准确性?
- kubernetes - Kubernetes PV/PVC not mounting to the correct volumeMounts in the pods
- bash - 查看 NUMBER 个本地未提交的文件
- javascript - How to view console.log() of webpage running inside React Native WebView?
- r - 从嵌套列表中提取特定变量的值,并将提取值的一列附加到我的原始数据集中
- python - Django how to only allow specific users to see a page
- python - 从 .apply() 更改为使用列表理解将一个数据帧与一列列表与另一个数据帧中的值进行比较的函数
- makefile - error in using tab in makefile how to fix it
- python - 我们可以在python中根据Mean和SD生成随机整数吗
- python - groupby+sum/mean/ect 然后分组值返回到原始数据帧中的原始未分组索引吗?