我是Spring JPA的新手,在插入一行时,我在实体上设置外键时遇到了一些麻烦。
我有以下实体
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String departmentName;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "department_id")
List<Employee> employees;
}
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String employeeName;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "employee_id")
List<Role> roles;
@ManyToOne
@JoinColumn(name = "department_id", insertable = false, updatable = false)
private Department department;
}
@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String roleName;
@ManyToOne
@JoinColumn(name = "employee_id", insertable = false, updatable = false)
private Employee employee;
@ManyToOne
@JoinColumn(name = "department_id", insertable = false, updatable = false)
private Department department;
}
这是部门存储库:
@Repository
public interface DepartmentRepository extends JpaRepository<Department, Integer> {
Department findById(long id);
}
使用这种方法,当我使用departmentRepository.save(department)
保存Department
对象时,employee
表中的department_id
和role
表中的employee_id
被正确设置。
但我也希望它在role
表中设置department_id
。如何才能做到这一点?目前,部门和角色的关系是间接的(即通过雇员),但是我是否必须在这两个实体之间创建直接关系?我不知道如何做到这一点。如有任何意见,我们将不胜感激。
编辑:
我想在这个实体关系图中建立关系模型
我看到你已经在使用
@OneToMany(cascade = CascadeType.ALL)
所以你知道每次更新Department with list Employee都可以做"许多"的东西。
所以雇员对角色(你的列表)做同样的事情,但神奇的自动保存/更新不起作用。
条件:
- 在repo中保存操作
- 员工名单
- 员工角色列表(每个对象没有部门Id)
As I understand:
您有1-n到Employee的Department (Employee只能有1个Department)
员工可以有多个Role
正常逻辑:部门1-n员工1-n角色
但有些部门也有你想要的角色对象。
所以我的第一个建议是改变逻辑代码。
第二:解决问题的方法!
创建部门添加Role到Employee时,也请访问并添加department_id。(部门保存员工列表,当保存员工列表角色时也以相同的逻辑保存,只需确保添加它)