jpa - 为什么@ManyToMany 关系不能正常工作?
问题描述
我有一个具有@ManyToMany 关系的用户实体和产品实体。我正在尝试将用户选择的产品存储到数据库中。
用户实体:
@Entity
@Table(name = "user")
@Getter
@Setter
@ToString
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;
private String password;
@Transient
private String passwordConfirm;
@ManyToMany
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;
@ManyToMany(mappedBy = "users")
private Set<Product> products;
}
产品实体:
@Entity
@Table(name = "product")
@Getter
@Setter
@ToString
public class Product{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private String id;
private String category;
private String name;
@ManyToMany
@JoinTable(name = "user_product", joinColumns = @JoinColumn(name = "product_id"), inverseJoinColumns = @JoinColumn(name = "user_id"))
private Set<User> users;
}
服务:
@Service
public class ProductServiceImpl implements ProductService{
@Autowired
private ProductRepository productRepository;
@Autowired
private UserRepository userRepository;
@Override
public void save(Product product) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String currentPrincipalName = authentication.getName();
User user = userRepository.findByUsername(currentPrincipalName);
Set<User> userSet = new HashSet<User>();
userSet.add(user);
product.setUsers(userSet);
productRepository.save(product);
}
}
控制器:
@Controller
public class ProductController {
@Autowired
private ProductService productService;
@PostMapping(value = "/product/add", consumes = MediaType.APPLICATION_JSON_VALUE)
public void add(@RequestBody Product product) {
productService.save(product);
}
}
联接表user_product
不允许我product_id
与多个用户一起保存。它不断删除已经存在的product_id
(对于以前保存的user_id
)并将其插入新user_id
的,如下所示。
Hibernate: select users0_.product_id as product_id1_5_0_, users0_.user_id as user_id2_5_0_, user1_.id as id1_4_1_, user1_.password as password2_4_1_, user1_.username as username3_4_1_ from user_product users0_ inner join user user1_ on users0_.user_id=user1_.id where users0_.product_id=?
Hibernate: delete from user_product where product_id=? and user_id=?
Hibernate: insert into user_product (product_id, user_id) values (?, ?)
如何通过让连接表允许和的组合来product_id
实现user_id
?
我将 Spring Data JPA 与 H2 数据库一起使用,并确保表列中的关系正确。如果我手动将记录插入表中,则允许但不通过代码。如果我在任何地方错了,你能纠正我吗?
解决方案
推荐阅读
- c# - 加密 reactjs 上的数据并在 c# 应用程序中解密
- mongodb - 计算数组中的元素数量并为mongodb中集合的每个文档求和?
- r - 如何删除某些组元素的第一行?
- unity3d - 谷歌播放控制台“发生意外错误。请稍后再试。(4800403)”?
- swift - 如何修复“'?:'表达式中的结果值类型不匹配'”
- javascript - 如何检查 Firebase 中的数据搜索是否成功
- c++ - 如果考虑到数组衰减,我只有指向第一个数组元素的指针,是否可以找到数组的长度?
- java - 将 .jpeg 和 .png 上传到 Java GraphQL 服务器时不支持内容类型 multipart
- entity-framework - 多对多关系类的CRUD操作示例 | 实体框架核心
- python - Python 的 __iter__ 和 __repr__ 他们在做什么?