我有一个奇怪的问题,请原谅我,如果我错了。
我的问题是,我在我的应用程序中为两个实体定义了ManyToOne映射。删除时我想忽略删除其他实体。
假设Emp to Dept有ManyToOne关系,我正在通过session.delete(EmpId)删除Emp记录,此时我不想删除与Emp实体关联的Dept。
我无法更改hbm中的级联选项。
场景类似于
“如果有10个emp属于部门编号101并且在删除时 任何一个emp它将尝试删除相关的部门也是 不可能,因为我们有一些属于同一部门的其他emp记录“
因此有一种方法可以在以编程方式删除emp记录时忽略删除dept记录。为什么在语法上是,但在这里我需要考虑级联选项,删除与dept 101记录关联的最后一个emp记录。我不想在删除之前的9个emp对象时考虑级联选项。
请建议我解决这个问题。
非常感谢!
答案 0 :(得分:0)
尝试使用HQL删除它,它会忽略级联配置。
session.createQuery("delete from Employee where id = ?").setParameter(0, empId).executeUpdate();
但是,如果已经加载到Hibernate会话中的其他实体仍引用您删除的实体,则可能会获得EntityNotFoundException
。你必须自己处理。
答案 1 :(得分:0)
根据您的问题,我创建了如下的实体类,以正确的方式解释我的答案,
注意: - 实体类只是我可能正在实施的假设 用不同的方式
@Entity
@Table(name="EMPLOYEE")
public class Emp implements Serializable {
@Id
@GeneratedValue()
@Column(name="ID")
private Long empId;
@ManyToOne
@JoinColumn(name="DEPARTMENT_ID")
private Dpt department;
other property
... getter() setter()
}
@Entity
@Table(name="DEPARTMENT")
public class Dpt implements Serializable {
@Id
@GeneratedValue()
@Column(name="ID")
private Long dptId;
@OneToMany(mappedBy = "department",cascade=CascadeType.ALL)
@Cascade(CascadeType.DELETE_ORPHAN)
private Set<Emp> employeeSet;
other property
... getter() setter()
}
根据您的要求,我在上面的代码段中创建了双向关联
问题1
假设Emp to Dept有ManyToOne关系,我正在通过session.delete(EmpId)删除Emp记录,此时我不想删除与Emp实体关联的Dept。
答案 在这里你正在表演
session.delete(EmpId)
如果您正在执行以下操作,请在代码中
@ManyToOne
@JoinColumn(name="DEPARTMENT_ID",cascade=CascadeType.ALL)
private Dpt department;
or
@ManyToOne
@JoinColumn(name="DEPARTMENT_ID",cascade=CascadeType.DELETE)
private Dpt department;
然后只有JPA在删除子(Emp)
时尝试删除父(Dpt)注意:: - 永远不要使用@ManyToOne级联
此处如果您从@ManyToOne中删除级联应解决您的问题(删除子(Emp)时删除父级(Dpt))
问题2
删除最后一次emp记录时,我需要考虑级联选项 与dept 101记录相关联。而且我不想考虑级联 删除之前的9个emp对象时的选项。
您可以以编程方式处理上述案例场景,您可以使用9个emp对象 使用
session.delete(EmpId)
和第10名员工
session.delete(DptId)
在上面的代码中我使用了
@OneToMany(mappedBy = "department",cascade=CascadeType.ALL)
@Cascade(CascadeType.DELETE_ORPHAN)
private Set<Emp> employeeSet;
此处@Cascade(CascadeType.DELETE_ORPHAN)
的功能是删除所有子(Emp)实体,如果删除了父(Dpt)实体,在您的情况下删除Dpt实体也会删除与该部门关联的最后一个Emp记录
希望这会对你有所帮助
谢谢!