如何从关系中删除子对象或父对象?

Posted

技术标签:

【中文标题】如何从关系中删除子对象或父对象?【英文标题】: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有关系,所以它不会删除。

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

【问题讨论】:

为什么要为同一个问题创建单独的线程?链接到您之前的问题,***.com/q/21545682/2968614 @Aditya 对不起,我不知道如何链接 【参考方案1】:

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

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

澄清关系映射:

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

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

【讨论】:

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

简而言之:

    获取开放的实体管理器

    开始交易

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

    提交事务

    关闭实体管理器

【讨论】:

【参考方案3】:

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

【讨论】:

谢谢你,当我删除 ProjectManager 时它会抛出异常。无法删除或更新父行:外键约束失败 (prabha.pancard, CONSTRAINT FK_pancard_EId FOREIGN KEY (EId) REFERENCES employee (id)) DELETE FROM employee WHERE (id = ?)

以上是关于如何从关系中删除子对象或父对象?的主要内容,如果未能解决你的问题,请参考以下文章

SWIFT 的核心数据:如何从关系实体中删除对象?

使用.Net Entity Framework 问题删除具有子关系的实体

JPA JPQL - 如果不使用子对象(没有主键/外键关系)并且可以删除,则返回的查询

从关系中删除孤立对象

如何在 Linq to SQL 中插入具有一对一关系的子对象

从核心数据获取请求中排除反向关系