编辑:糟糕,我想如果发布删除代码会有所帮助。抱歉。
// 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)注释,所以:
@OneToMany(cascade=CascadeType.ALL)
Class MyParent { @OneToMany(cascade=CascadeType.ALL) Set<MyObject> myObjects; }
Hibernate显然遍历了整个对象图,由于某种原因,由于没有删除此 父级 ,因此它取消了 子级 删除。
要检测到这一点,您需要将日志记录一路转到最新状态,TRACE并从Hibernate查找以下消息:
TRACE
un-scheduling entity deletion
这些是让您知道Hibernate正在取消删除的神奇词汇。这没有特别有据可查的,所以我希望这对其他人有帮助。