// 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和hibernate 3.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;
}
任何人都可以看到任何可能暗示该实体不会删除的原因吗?
答案 0 :(得分:18)
原来这是Hibernate @OneToMany注释取消删除的情况。
因为父对象上有一个@OneToMany(cascade=CascadeType.ALL)
注释,如下所示:
Class MyParent {
@OneToMany(cascade=CascadeType.ALL)
Set<MyObject> myObjects;
}
Hibernate显然会遍历整个对象图,由于某种原因,因为父未被删除,它取消了子删除。
要检测到的是将日志记录一直转到TRACE
并从Hibernate中查找以下消息:
un-scheduling entity deletion
这些是让您知道Hibernate取消删除的神奇词汇。这没有特别好记录,所以我希望这有助于其他人。
答案 1 :(得分:-2)
在映射类中使用此级联类型。它将从数据库中删除记录。
@OneToMany(cascade=CascadeType.ALL)