当前位置: 首页 > 知识库问答 >
问题:

如何在Hibernate中排除映射实体

唐弘益
2023-03-14

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

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

假设Emp到Dept有多个关系,我正在通过会话删除Emp记录。删除(EmpId),此时我不想删除与Emp实体关联的部门。

我不能在hbm中改变级联选项。

这种情况类似于

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

所以,有没有一种方法可以在按语法删除emp记录时忽略删除dept记录。为什么语法是,但在这里我需要考虑级联选项删除最后EMP记录相关的DePT 101记录。我不想考虑级联选项,而删除前9个EMP对象。

请建议我在这种情况下工作。

谢谢!

共有2个答案

葛驰
2023-03-14

根据您的问题,我创建了如下实体类,以适当的方式解释我的答案,

注意:-实体类只是我的假设,您可能以不同的方式实现它

@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到Dept有多个关系,我正在通过会话删除Emp记录。删除(EmpId),此时我不想删除与Emp实体关联的部门。

在这里回答你的表演

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尝试删除父(Dpt)而删除子(Emp)

注意:-切勿将级联与@ManyToOne一起使用

在这里,如果您从@ManyToOne中删除cascade,应该可以解决您的问题(在删除子项(Emp)的同时删除父项(Dpt))

问题二

在删除与DePT 101记录相关联的上次EMP记录时,需要考虑级联选项。我不想考虑级联选项,而删除前9个EMP对象。

对于可以使用的9个emp对象,您可以编程处理上述情况场景

 session.delete(EmpId)

还有第十个雇员

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

希望这对你有帮助

谢谢

卢德惠
2023-03-14

尝试用HQL删除它,它会忽略级联配置。

session.createQuery("delete from Employee where id = ?").setParameter(0, empId).executeUpdate();

但是,如果已经加载到Hibernate会话中的其他实体仍然引用您删除的实体,您可能会得到EntityNotFoundExcema。你必须自己处理这件事。

 类似资料:
  • 问题内容: 我有一个颜色枚举 我有包含它的MyEntity。 我已经有一个UserType来映射我的枚举。 您知道如何在Hibernate hbm.xml中映射枚举集吗? 我需要UserType还是最简单的方法? 谢谢 编辑: 只是为了说明一下,我正在寻找 hbm.xml 配置而不是@CollectionOfElements注释 问题答案: 我使用EnumSet映射线程中的解决方案,该解决方案依赖

  • 我在Kotlin-vertx项目中配置了Hibernate,我设法设置了所有内容,但当我运行HQL查询时,它会输出: 提前谢了。

  • 是否可以在不映射一对多关系的情况下设置级联? 我有两个实体: 和 如果我试图删除一个用户,并且存在该用户的任何记录,那么由于外键的原因,它显然会失败。我想在删除用户之前删除该用户的所有记录。我看到两种选择: > 映射s为关系中的,并设置。 在删除用户之前手动删除它们 有没有第三个选项,如何在用户实体中设置无映射记录的级联?

  • 我们必须在可选元素“mappedby”中指定什么。是特定模型的table_name还是classname? 哪个是正确的? 这个

  • 我正在使用Hibernate和JPA注释来映射我的类。当hibernate尝试映射这个类时,我遇到了一个问题 我的Social alStat类是: 我得到了这个错误: 我猜发生这种情况是因为我试图映射到一个基本类,但@ElementCollection注释不应该解决这个问题吗? 我的item类如下所示:

  • <![CDATA[插入MEMBER_SERVICE_RECORD(MEMBER_ID,SERVICE_DATE,service_milees,SERVICE_DESC,MODIFIED_DATE)值(?,?,?,?,?)]]>