如何在Hibernate中排除映射实体

时间:2015-04-21 14:25:24

标签: hibernate

我有一个奇怪的问题,请原谅我,如果我错了。

我的问题是,我在我的应用程序中为两个实体定义了ManyToOne映射。删除时我想忽略删除其他实体。

假设Emp to Dept有ManyToOne关系,我正在通过session.delete(EmpId)删除Emp记录,此时我不想删除与Emp实体关联的Dept。

我无法更改hbm中的级联选项。

场景类似于

  

“如果有10个emp属于部门编号101并且在删除时   任何一个emp它将尝试删除相关的部门也是   不可能,因为我们有一些属于同一部门的其他emp记录“

因此有一种方法可以在以编程方式删除emp记录时忽略删除dept记录。为什么在语法上是,但在这里我需要考虑级联选项,删除与dept 101记录关联的最后一个emp记录。我不想在删除之前的9个emp对象时考虑级联选项。

请建议我解决这个问题。

非常感谢!

2 个答案:

答案 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记录

希望这会对你有所帮助

谢谢!