spring-boot - 服务中的多对多关系使用
问题描述
工作实体
@Column(name = "name")
private String name;
@ManyToMany
@JoinTable(name = "user_job",
joinColumns = @JoinColumn(name = "job_id"),
inverseJoinColumns = @JoinColumn(name = "user_id")
)
private List<User> user;
用户实体
@Column(name = "email")
private String email;
@ManyToMany
@JoinTable(name = "user_job",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
private Set<Role> roles;
角色实体
@Column(name = "name")
private String name;
@ManyToMany(mappedBy = "roles")
private Set<User> users;
这里我们有一个具有 3 个 id 的表 user_job,我想在服务层中插入数据。我该怎么做以及我应该实现或使用像用户/角色/作业这样的现有存储库?
class UserJobService{
public void setUserJob(User user, Job job, Role role){
}
}
解决方案
关联的问题@ManyToMany
是您不能user_job
使用 Hibernate 直接从表中删除记录。要删除记录,您需要加载用户的所有工作。所以最好添加UserJobEntity
@Entity
@Table(name = "USER_JOBS")
class UserJobEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
private User user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "JOB_ID")
private Job job;
}
public UserJobEntity createUserJob(UserEntity user, JobEntity job) {
UserJobEntity userJob = new UserJobEntity();
userJob.setUser(user);
userJob.setJob(job);
return userJobRepository.save(userJob);
}
可能您会想要向user_jobs
表中添加(用户、作业)唯一约束。
一些建议
- 表名使用复数形式。
user_jobs
代替user_job
Role
是表格数据。所以它不应该有 usersList
。- 不要
Set
用于关联的集合。您肯定会遇到“多个错误获取异常”,此异常将帮助您更改查询。有了Set
你可以有很大的交叉产品,甚至没有注意到它们。