无法删除具有一对多映射关系的表中的记录

问题描述 投票:0回答:2

在我的春季启动应用程序中,雇员和项目是两个实体类,这里项目与雇员具有一对多的关系。在这里,我期望当我调用删除项目表中项目的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。

hibernate mapping one-to-many
2个回答
0
投票

在您的Project Table外键中添加DELETE CASCADE,它引用了雇员表主键。

它的工作原理就像您删除任何项目一样,它都会对其外键(也就是employee表)进行CASCADE删除操作。

有关更多详细信息,请访问http://mysqltutorial.org/mysql-on-delete-cascade/


0
投票

我找到了解决方案,解决方案是将foriegn键设置为updatable = false。感谢您的帮助,希望对其他人有用。

© www.soinside.com 2019 - 2024. All rights reserved.