【问题标题】:How to delete Child or Parent objects from Relationship?如何从关系中删除子对象或父对象?
【发布时间】:2014-02-05 06:18:28
【问题描述】:

我做了一个有更多关系的小应用程序。现在我想删除我的表的详细信息我该如何删除我没有任何要删除的想法。

关系如下:

PanCard-->员工(小野对一)

Employee-->ProjectManger(到 Employee 的双向多对一关联)

Projects -->ProjectManager(与Projects的双向多对一关联)

现在我要删除一个一个表数据的数据

下面是我的 POJO 类代码:

PanCard.java

  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  @Column(name="id")
  private int id;
  @Column(name="pName")
  private String pName;
  @Column(name="pNumber")
  private int pNumber;    
  @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
  @JoinColumn(name="EId")
  private Employee employee;

Employee.java

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "empFirstName")
private String empFirstName;
@Column(name = "empLastName")
private String empLastName;
@Column(name = "empDepartment")
private String empDepartment;   
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="pmId")      
private ProjectManager projectManager;

ProjectManager.java

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;

private String department;

private String managerFirstName;

private String managerLastName;

//bi-directional many-to-one association to Myemployee

@OneToMany(mappedBy="projectManager",cascade = CascadeType.ALL)
private List<Employee> employee;

@OneToMany(mappedBy="projectManager",cascade = CascadeType.ALL)
private List<Projects> projects;

Projects.java

 @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  @Column(name="id")
  private int id;
  @Column(name="projectName")
  private String projectName;
  @Column(name="projectDesc")
  private String projectDesc;     
  @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
  @JoinColumn(name="pmId")    
  private ProjectManager projectManager;

现在我想删除表数据:我应该从哪个表开始删除。

  • 如果我想删除Pancard,我应该删除ProjectManager,因为Employee 有FK。
  • 如果我想删除ProjectManager,它应该删除EmployeeProjects,但EmployeePanCard有关系所以它没有删除。
  • 如果我想删除Projects,它应该删除ProjectManager,但ProjectMangerEmployee有关系,所以它不会删除。

所以我必须从哪里开始删除以及如何删除我不知道的。

【问题讨论】:

标签: java hibernate jpa one-to-one many-to-one


【解决方案1】:

您可以从任何您喜欢的表格中开始删除。但是,如果您想为此使用 JPA,则必须防止违反约束。您可以通过

  • 从拥有方删除,或
  • 取消设置拥有实体的外键,然后从反面删除。

澄清关系映射:

  • PanCard 是与 Employee 关系的拥有方。
  • Employee 是与 ProjectManager 关系的拥有方。
  • Project 是与 ProjectManager 关系的拥有方。

一般建议 - 不要从多方面使用级联。结果大多不是您想要的 - 违反约束。如果您删除 Employee,则删除将级联到 ProjectManager。由于一个经理可以有多个员工,因此会违反Employee 表中的外键约束。所以我会删除从EmployeeProjectManager 的级联。

【讨论】:

  • 谢谢先生。所以在哪些 POJO 类中我必须删除 CascadtType.ALL
  • 不客气。我会限制从 Employee 到 ProjectManager 以及从 Project 到 ProjectManager 的级联。您不必完全删除所有级联,但您不需要 REMOVE 级联。
【解决方案2】:

简而言之:

  1. 获取开放的实体管理器

  2. 开始交易

  3. 删除必要的引用(即执行您想要执行的操作,但确保之后满足所有约束)

  4. 提交事务

  5. 关闭实体管理器

【讨论】:

    【解决方案3】:

    为什么要在删除员工的同时删除项目经理?
    这不是一对一的关系,还有其他员工和其他项目。

    【讨论】:

    • 谢谢你,当我删除 ProjectManager 时它会抛出异常。无法删除或更新父行:外键约束失败 (prabha.pancard, CONSTRAINT FK_pancard_EId FOREIGN KEY (EId) REFERENCES employee (id)) DELETE FROM employee WHERE (id = ?)
    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多