当前位置: 首页 > 面试题库 >

Hibernate删除一条记录,但是该记录不会消失吗?

程俊健
2023-03-14
问题内容

编辑:糟糕,我想如果发布删除代码会有所帮助。抱歉。

    // delete from permanent store and local list
    int index = get_record_to_delete();
    if (entityList.getEntities().get(index).getEntityId() != null ) {
        // existing persisted record
        entityService.delete(entityInfo.getEntities().get(index).getEntityId());
    }
    //remove from local list
    entityList.getEntities().remove(index);
    return ownersInfo;



    // entityService called by above code
    public void delete(MyEntity entity)  {
        repository.delete(entity);  // subclass of org.springframework.data.jpa.repository.JpaRepository
    }

我正在使用Spring Data / JPA V 1.4.2.RELEASE和hibernate3.6.10.Final。

我遇到的情况是删除一个实体,删除似乎可以正常工作,但是当我刷新网页时,该实体会重新出现。因此,它不会产生错误,但不会删除记录。

该实体中包含子实体。我怀疑某种实体依赖问题会阻止实体真正被“删除”,但我不知道它可能是哪种实体依赖,而且Hibernate并未告诉我。所包含的实体是否被删除并不重要,但是该实体需要被删除。不知道为什么没有发生。这是我要删除的实体:

public class MyEntity implements java.io.Serializable {
    @Id
    @GeneratedValue
    @Column(name = "MYID", unique = true, nullable = false)
    private Long myId;

    @Column(name = "MY_NAME", nullable = false, length = 50)
    private String myName;

    @ManyToOne
    @JoinColumn(name = "ADDRESS_ID", nullable = false)
    private AddressEntity myAddress;

    @ManyToOne
    @JoinColumn(name = "OTHER_ADDRESS_ID", nullable = true)
    private AddressEntity myOtherAddress;

    @ManyToOne
    @JoinColumn(name = "TYPE_CODE", nullable = false)
    private MyType myType;

    @ManyToOne
    @JoinColumn(name = "ADDRESS_CODE", nullable = false)
    private AddressCode addressCode;

    @Column(name = "OTHER", nullable = false, precision = 3, scale = 0)
    private Integer myOther;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID", nullable = false)
    private MyParent parent;

    @Column(name = "PHONE", nullable = false, precision = 10, scale = 0)
    private Long myPhone;

    @Column(name = "SOCIAL", nullable = false, length = 9)
    private String mySocial;
}

任何人看到的任何东西都可能暗示为什么该实体不会删除?


问题答案:

原来是Hibernate @OneToMany批注取消删除的情况。

因为父对象上面有@OneToMany(cascade=CascadeType.ALL)注释,所以:

Class MyParent {

    @OneToMany(cascade=CascadeType.ALL)
    Set<MyObject> myObjects;

}

Hibernate显然遍历了整个对象图,由于某种原因,由于没有删除此 父级 ,因此它取消了 子级 删除。

要检测到这一点,您需要将日志记录一路转到最新状态,TRACE并从Hibernate查找以下消息:

un-scheduling entity deletion

这些是让您知道Hibernate正在取消删除的神奇词汇。这没有特别有据可查的,所以我希望这对其他人有帮助。



 类似资料:
  • 我们有一个Kafka流聚合拓扑。我们需要控制changeLog主题的大小,以减少Kafka存储成本。因此,我们在拓扑中使用transformer(DSL API)调度标点符号,该标点符号使用KeyValueStore.delete()从stateStore中删除旧记录。 我能够验证在删除之后,在进一步调度的标点符号触发器中,删除的键不在状态存储中。但是它是否也会从changeLog主题中删除该记录

  • EventLicensetype.hbm.xml文件: 下面是EventInfo类。同样,在实际文件中有更多的字段,这只是重要的部分: 下面是EventLicenseType类 为什么它不能直接删除记录?为什么它要更新??我还尝试将代码更改为下面的代码,并得到相同的错误。 谁能帮我解决我缺少的东西,或者给我指明正确的方向?

  • 删除记录命令用于从数据库中完全删除一个或多个记录。 以下语句是命令的基本语法。 以下是有关上述语法中选项的详细信息。 - 指定如何锁定加载和更新之间的记录。有两个选项来指定默认和记录。 - 指定要返回的表达式而不是记录数。 - 定义要更新的最大记录数。 - 定义在超时之前允许更新运行的时间。 注 - 请勿使用删除“顶点”或“边”,因为它会影响图的完整性。 示例 让我们考虑在前一章中创建的表。 编号

  • RemoveResult remove(RemoveRequest request) 功能 删除某个表的一条记录,可以删除全部或者部分属性,也可以指定条件,当条件成立时才删除成功 消耗一个单位写配额,如果带了条件,还消耗一个单位读配额(另外如果创建了EAGER类型的二级索引,每个Eager二级索引需要1个额外读配额) 方法参数 request : RemoveRequest : required

  • 我使用的是JBoss,因此需要排除JBoss自己的日志子系统,以便进行日志记录,我使用的是jboss-deployment-structure.xml文件: 我使用的是JPA,因此如果这可能有所帮助,这是我的persistence.xml文件:

  • 本章提供了有关如何使用JDBC应用程序从表中删除记录的示例。 在执行以下示例之前,请确保您已满足以下条件 - 要执行以下示例,您可以使用实际用户名和密码替换用户名和密码。 您的MySQL或您使用的任何数据库已启动并正在运行。 所需的步骤 (Required Steps) 使用JDBC应用程序创建新数据库需要以下步骤 - Import the packages:要求包含包含数据库编程所需的JDBC类