首页 > 解决方案 > Spring data - 删除与视图相关的抑制

问题描述

所以我有两个实体:

@Getter
@Setter
@Entity
@Table(name = "MY_TABLE")
public class MyTable {
    @Id
    @Column(nullable = false, length = 18)
    @SequenceGenerator(name = "MY_TABLE_seq", sequenceName = "MY_TABLE_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_TABLE_seq")
    private long id;

    @OneToOne(mappedBy = "myTable")
    private MyTableView myTableView;
}

还有一个不可变实体(原因是它是一个数据库视图):

@Entity
@Getter
@Immutable
@Table(name = "MY_TABLE_VIEW")
public class MyTableView {
    @Id
    @Column(name = "ID", nullable = false, length = 18)
    private Long id;

    @OneToOne
    @MapsId
    @JoinColumn(name = "id")
    private MyTable myTable;
}

更新和创建 MyTable 没有问题。当我尝试删除 MyTable 时,问题就开始了。我正在为此使用存储库:

public interface MyTableRepository extends CrudRepository<MyTable,Long> {
}

在我使用的服务中:

public void deleteMyTable(Long id){
/*fetch the my table enity*/
   myTableRepository.delete(myTable);
}

什么都没发生。一点也不例外。我尝试的是更改 @OneToOne 映射。具有不同的级联:

@OneToOne(mappedBy = "myTable",cascade = CascadeType.ALL)
@OneToOne(mappedBy = "myTable",cascade = CascadeType.DETACH)
@OneToOne(mappedBy = "myTable",cascade = CascadeType.MERGE)
@OneToOne(mappedBy = "myTable",cascade = CascadeType.REFRESH)
@OneToOne(mappedBy = "myTable",cascade = CascadeType.REMOVE)
@OneToOne(mappedBy = "myTable",cascade = CascadeType.PERSIST)

有谁知道如何解决这个问题?

标签: javaspringhibernatespring-data-jpaspring-data

解决方案


如问题评论中所示,我建议您尝试创建某种@PreRemove钩子以避免该问题。

因为根据实体之间关系的定义方式,它非常有意义。

但是如果你考虑一下,你正在处理一个视图,一个只读实体:在我看来,颠倒关系并创建MyTable所有者更有意义。此外,它可能会解决这个问题。

请考虑像这样定义您与MyTableViewin 的关系MyTable

@OneToOne
@JoinColumn(name = "id", referencedColumnName = "id")
private MyTableView myTableView;

在中,通过以下方式MyTableView简化您的关系:MyTable

@OneToOne(mappedBy = "myTableView")
private MyTable myTable;

推荐阅读