Spring数据-删除相对于视图被抑制



所以我有两个实体:

@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)
  • ALL、MERGE和REMOVE抛出和异常,因为我无法从视图
  • DETACH、REFRESH和PERSIST什么都不做,但是MyTable实体不是已删除

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

如问题注释所示,我建议您尝试创建某种@PreRemove挂钩以避免出现此问题。

因为根据你的实体之间的关系是如何定义的,这是完全合理的。

但如果你仔细想想,你正在处理一个视图,一个只读实体:在我看来,颠倒关系并使MyTable成为所有者更有意义。此外,它可能会解决这个问题。

请考虑在MyTable中定义您与MyTableView的关系,如下所示:

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

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

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

这可能是由映射上的约束引起的。一种替代的去除";MyTableView";当删除";MyTable";是设置";orphanRemoval=true";。我认为这对于双OneToOne映射更好。有一些链接(我希望(可以帮助你:

休眠一对一映射。从从属表中删除行

JPA orphanRemoval=true与ON DELETE CASCADE DML子句有何不同

相关内容

  • 没有找到相关文章

最新更新