JpaRepository结合@SQLDelete实现软删除失效问题求助
JpaRepository结合@SQLDelete实现软删除失效问题求助
各位好,我最近碰到了一个JPA软删除失效的麻烦问题,折腾了好一阵都没找到根源,想请大家帮忙分析下原因,看看怎么把软删除的正常行为恢复回来。
先给大家说下我的基础场景:我用Spring Data JPA的JpaRepository,配合@SQLDelete注解在PostgreSQL数据库上实现软删除。原本这套逻辑运行得好好的,但自从给实体X加上和Y的关联关系后,软删除就彻底不管用了——调用xRepository.delete(x)后,X的status字段根本不会被更新为'DELETED',而且我查了执行的SQL日志,连对应的UPDATE或者DELETE语句都没出现,可我百分百确认调用delete方法的代码确实执行了。
下面是我的相关代码细节:
原本正常的软删除配置(实体X)
@Entity @Table(name = "X") @NoArgsConstructor @Getter @Setter @JsonIgnoreProperties(ignoreUnknown = true) @SQLDelete(sql = "UPDATE X SET status = 'DELETED' WHERE id = ?", check = ResultCheckStyle.COUNT) @Where(clause = "status != 'DELETED'") public class X extends BasicEntity { // 原有字段... }
触发问题的关联关系
后来我给X实体加了和Y的一对一关联:
@OneToOne(mappedBy = "x") private Y y;
Y实体的定义是这样的,而且数据库里还有一个基于Y的物化视图:
CREATE MATERIALIZED VIEW IF NOT EXISTS Y...
@Entity @Table(name = "Y") @AllArgsConstructor @NoArgsConstructor @Getter @Setter public class Y implements Serializable { @Id private Long xId; @OneToOne @MapsId @JoinColumn(name = "x_id") private X x; }
问题现象
调用删除的代码是常规的Spring Data JPA方法:
@Repository public interface XRepository extends JpaRepository<X, Long>, JpaSpecificationExecutor<X> {} // 业务代码中调用 xRepository.delete(x);
现在的情况是:调用delete方法的代码确实执行了,但X的status没有被设置为'DELETED',SQL日志里也完全找不到对应的UPDATE语句。
想请教大家:
- 为什么加了这个一对一关联后,软删除就失效了?
- 我该怎么恢复原本正常的软删除行为?
谢谢大家!
内容来源于stack exchange
相关产品推荐
相关产品推荐

