首页 > 解决方案 > 服务中的多对多关系使用

问题描述

工作实体

    @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){

}
}

标签: spring-boothibernatejpa

解决方案


关联的问题@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表中添加(用户、作业)唯一约束。

一些建议

  1. 表名使用复数形式。user_jobs代替user_job
  2. Role是表格数据。所以它不应该有 users List
  3. 不要Set用于关联的集合。您肯定会遇到“多个错误获取异常”,此异常将帮助您更改查询。有了Set你可以有很大的交叉产品,甚至没有注意到它们。

推荐阅读