【问题标题】:Spring data - Deletion is suppressed with relation to viewSpring data - 删除与视图相关的抑制
【发布时间】:2021-09-06 03:08:14
【问题描述】:

所以我有两个实体:

@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 实体不是 已移除

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

【问题讨论】:

  • 你能去掉@Repository注解也可以把事务放到服务层吗? Spring data 自动为你扫描包。
  • @Gurkanİlleez 是的,我可以做到
  • 我从您的代码中了解到,您尝试从表中删除并自动更新视图
  • @Gurkanİlleez :是的,这是正确的
  • @Gurkanİlleez :最后我希望能够删除表格并通过这样做来刷新视图。因为我无法从视图中删除

标签: java spring hibernate spring-data-jpa spring-data


【解决方案1】:

如问题 cmets 所示,我建议您尝试创建某种@PreRemove 挂钩以避免该问题。

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    这可能是由于映射的约束造成的。 删除“MyTable”时删除“MyTableView”实例的另一种方法是设置“orphanRemoval = true”。我认为这对于双 OneToOne 映射更好。 有一些链接(我希望)可以帮助你:

    Hibernate one to one mapping. Delete row from dependent table

    How does JPA orphanRemoval=true differ from the ON DELETE CASCADE DML clause

    【讨论】:

    • 我尝试过删除孤儿。它仍然尝试对不起作用的视图进行删除
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2014-07-06
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多