【问题标题】:cannot delete records from a table which has one to many Mapping with another无法从具有一对多映射的表中删除记录
【发布时间】:2020-03-12 09:49:35
【问题描述】:

在我的spring boot应用程序中,员工和项目是两个实体类,这里项目与员工是一对多的关系。在这里,当我调用删除项目表中项目的 api 时,我希望与员工表中的项目相关联的所有员工都被删除。

这是我的实体类,这是项目类:

@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


【解决方案1】:

在引用员工表主键的项目表外键中添加 ON DELETE CASCADE。

它会像你删除任何项目时一样工作,它会对它的外键(即员工表)进行 CASCADE 删除操作。

更多详细操作方法,可以访问http://mysqltutorial.org/mysql-on-delete-cascade/

【讨论】:

  • CascadeType.remove 也是如此
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    当我们有重复索引时会发生这种情况。所以我们必须在 Database 类中准确地索引变量。

    【讨论】:

    • 请添加一些片段来支持您提出的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2014-10-16
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多