所以我有两个实体:
@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子句有何不同