我有一个人可以参与许多项目,每个项目都扮演不同的角色。
问题:如何正确编写一个控制器,这样当你进入一个人的页面时,你需要接收到他参与的项目以及角色的信息。
我使用:spring boot、thymeleaf、jpa、postgre。
请告诉我如何做到这一点?或修复结构以正确实施。非常感谢 !
项目
@Entity
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long idProject;
private String nameProject;
@OneToMany(
mappedBy = "project",
cascade = CascadeType.ALL,
orphanRemoval = true
)
List<ProjectUser> users = new ArrayList<>();
public List<ProjectUser> getUsers() {
return users;
}
public void setUsers(List<ProjectUser> users) {
this.users = users;
}
// getter, setter , equals , hashcode
人类
@Entity
@Table(name = "Usr")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long idUser;
private String name;
// фамилия
private String surname;
// отчество
private String patronymic;
@OneToMany(
mappedBy = "user",
cascade = CascadeType.ALL,
orphanRemoval = true
)
List<ProjectUser> projects = new ArrayList<>();
// getter, setter, hashcode,equals
项目用户 ID
@Embeddable
public class ProjectUserId implements Serializable {
@Column(name = "id_project")
private Long idProject;
@Column(name = "id_user")
private Long idUser;
public ProjectUserId() {
}
public ProjectUserId(Long idProject, Long idUser) {
this.idProject = idProject;
this.idUser = idUser;
}
public Long getIdProject() {
return idProject;
}
public Long getIdUser() {
return idUser;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass())
return false;
ProjectUserId that = (ProjectUserId) o;
return Objects.equals(idProject, that.idProject) &&
Objects.equals(idUser, that.idUser);
}
@Override
public int hashCode() {
return Objects.hash(idProject, idUser);
}
}
项目用户
@Entity(name = "ProjectUser")
@Table(name = "project_user")
public class ProjectUser {
@EmbeddedId
private ProjectUserId id;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("id_project")
@JoinColumn(name = "id_project")
private Project project;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("id_user")
@JoinColumn(name = "id_user")
private User user;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
@Column(name = "created_on")
private Date createdOn = new Date();
// статус человека
@Column(name = "RoleUser")
@Enumerated(EnumType.STRING)
private RoleUser roleUser;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass())
return false;
ProjectUser that = (ProjectUser) o;
return Objects.equals(project, that.project) &&
Objects.equals(user, that.user);
// getter, setter
}
控制器
@GetMapping("/oneUser/{id}")
public String listOne(@PathVariable Long id, Model model) {
Optional<User> user = userRepository.findById(id);
....
return "operations/oneUser";
}
从你的表的结构来看,你还想在相邻的 user_project 表中指定用户的角色。从构建数据库的体系结构的角度来看,我认为这不是完全正确的解决方案。在当前架构中,要在 DAO 层中获得您要查找的内容,您需要编写如下内容:
此查询将为您提供所需用户的所有记录,并相应地提供其中的所有项目和角色。此外,从收到的列表中,您可以获取项目名称和其中的角色