在我的春季启动应用程序中,雇员和项目是两个实体类,这里项目与雇员具有一对多的关系。在这里,我期望当我调用删除项目表中项目的api时,与employee表中的项目相关联的所有雇员都将被删除。
这里是我的实体类,这是项目类:
@Entity
@Table(name="project")
public class ProjectEmp {
@Id
private int proId;
private String proname;
@OneToMany(targetEntity = Employee.class,fetch = FetchType.LAZY,cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
@JoinColumn(name="eproId",referencedColumnName = "proId")
private List<Employee> emplo= new ArrayList<Employee>();
public List<Employee> getEmplo() {
return emplo;
}
public void setEmplo(List<Employee> emplo) {
this.emplo = emplo;
}
...............
这是我的员工班级,它与另一个称为部门的班级也具有多对一的关系:
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int empId;
private String empName;
private String desig;
private int eproId;
@ManyToOne(targetEntity = Department.class,fetch = FetchType.EAGER)
@JoinTable(name="empdep",joinColumns = @JoinColumn(name = "empId"), inverseJoinColumns =@JoinColumn(name="depId"))
@JsonManagedReference
@JsonIgnore
private Department dep;
public Department getDep() {
return dep;
}
public void setDep(Department dep) {
this.dep = dep;
}
public int geteproId() {
return eproId;
}
public Employee seteproId(int eproId) {
this.eproId = eproId;
return this;
}
public String getDesig() {
return desig;
}
public Employee setDesig(String desig) {
this.desig = desig;
return this;
}
...............
这是我的控制器,用于传递必须删除的项目ID:
@RequestMapping(value = "/delete/{id}",method=RequestMethod.DELETE)
public void deluse(@PathVariable int id) throws Exception
{
empService.delpro(id);
}
这是我删除记录的服务:
public void delpro(int id) {
ProjectEmp pp= proRepo.findByproId(id);
pp.getEmplo();
proRepo.delete(pp);
}
我得到的输出是:
Column 'epro_id' cannot be null
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1340) ~[mysql-connector-java-8.0.17.jar:8.0.17]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025) ~[mysql-connector-java-8.0.17.jar:8.0.17]
预期输出是要删除与之相关的项目ID和员工ID。
在您的Project Table外键中添加DELETE CASCADE,它引用了雇员表主键。
它的工作原理就像您删除任何项目一样,它都会对其外键(也就是employee表)进行CASCADE删除操作。
有关更多详细信息,请访问http://mysqltutorial.org/mysql-on-delete-cascade/
我找到了解决方案,解决方案是将foriegn键设置为updatable = false。感谢您的帮助,希望对其他人有用。