【发布时间】:2019-05-13 09:45:47
【问题描述】:
我正在开发一个项目管理系统,该系统具有三个用户,即员工、经理和 HRM。员工和经理位于具有多对多递归关系的同一实体中(我们称之为员工实体)。 Employee 实体和 HRM 实体继承了一个 User 实体。这里使用的hibernate继承策略是单表。 最初,当用户注册时,他被保存为用户的实例(用户类型的存储库)。当他被分配到特定项目时,我想将用户实例更新为员工实例或经理实例。如何使用 spring data jpa 来实现。我正在使用 spring boot 做这个项目。
我已经使用 java 类创建了实体并映射了每个实体。 我没有在以下代码中提供 Project 和 Tasks 类。如有需要我可以提供。
下面是 User 类。
@Entity
@Table(name = "users")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name="User_Type",
discriminatorType=DiscriminatorType.STRING
)
public class User{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="user_id")
private Long id;
private String name;
private String email;
private String password;
private String mobilenumber;
private String gender;
private String resetToken;
@ManyToMany(fetch = FetchType.LAZY, cascade={CascadeType.ALL})
@JoinTable(name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();//roles refer to the employee,manager and HRM roles
//public getters and setters
下面是继承的Employee类
@Entity
@DiscriminatorValue("Employee")
public class Employee extends User {
@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
@JoinTable(name = "employee_project",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "project_id")
)
private Set<Project> project = new HashSet<>();
@ManyToMany
@JoinTable(name = "employee_tasks",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "task_id")
)
private Set<Task> tasks = new HashSet<>();
@ManyToMany
@JoinTable(name = "rm_employee",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "rm_id")
)
private Set<Employee> managers = new HashSet<>();
@ManyToMany
@JoinTable(name = "rm_employee",
joinColumns = @JoinColumn(name = "rm_id"),
inverseJoinColumns = @JoinColumn(name = "user_id")
)
private Set<Employee> employees = new HashSet<>();
//public getters and setters
我尝试了以下方法,将 User 的实例向下转换为 Employee 的实例,这会导致 CastException。
Optional<User> optional = userRepo.findById(id);
Employee employee = (Employee)optional.get();
【问题讨论】:
-
不能。 Java 对象有一个类型,Java 对象的类型是不能改变的。您需要不使用 JPA,而是使用 JDBC 来修改表中的 DTYPE 列,或者(更好)您需要更改设计并使用组合而不是继承:使用 具有 角色,并且此角色可以是员工或经理。
-
哦,好的。因此,如果我使用组合而不是继承,我是否能够将用户从用户类型更改为员工类型或经理类型,并在特定项目完成后再次返回用户。你能推荐一个学习作文的教程吗?谢谢顺便说一句。
-
是的:
user.setRole(managerRole); user.setRole(basicUserRole); -
我已经上传了答案,它工作正常@JBNizet
标签: mysql hibernate spring-boot spring-data-jpa single-table-inheritance