2017-10-07 97 views
0

我尝试使用Hibernate的注释与下面的实体来实现软删除:与级联Hibernate的软删除设置FK为NULL

@MappedSuperclass 
public abstract class AbstractEntity implements Serializable { 
    ... 
@Column(name = "DELETED") 
protected boolean deleted = false; 
    ... 
} 

@Entity 
@Table(name = "TARGET") 
@Where(clause = "deleted = '0'") 
@SQLDelete(sql = "UPDATE target SET deleted = '1'") 
public class Target extends AbstractEntity { 
    ... 
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinColumn(name = "TARGET_ID") 
private Set<Recording> recordings; 
    ... 
} 

@Entity 
@Table(name = "RECORDING") 
@Where(clause = "deleted = '0'") 
@SQLDelete(sql = "UPDATE recording SET deleted = '1'") 
public class Recording extends AbstractEntity { 
    ... 
@ManyToOne 
@JoinColumn(name = "TARGET_ID") 
private Target target; 
    ... 
} 

缺失本身就是EntityManager的一个电话:

entityManager.remove(target); 

在此调用之后,Target和其所有录制文件都将删除标志设置为TRUE,如预期的那样。 但录音也有TARGET_ID列设置为NULL,这是非常不幸的,因为关系丢失。这不是我所期望的,恢复状态是不可能的。 我期望TARGET_ID仍然持有对目标的引用。

我做错了什么?或者我必须手动删除每个录音而不使用级联?

用Spring Data JPA 1.11.4,Hibernate 5.0.12和JPA2.1完成。

感谢您的任何提示

回答

0

从目标到录制你的@OneToMany关系被设定incoretly。试试:

@OneToMany(mappedBy="target", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
private Set<Recording> recordings; 
+0

这种关系就好了。通过这种方式,您可以在不需要额外努力的情况下管理双方的关系。 – user1622058