繁体   English   中英

Spring 数据 JDBC 查找表级联删除

[英]Spring Data JDBC Lookup Tables Cascading Deletes

我有一个类似于下面的结构。 当父/子被删除/保存/更新时,我只需要检索查找数据而不是删除/保存/更新它。 查找表中的数据为 static。 我正在使用 spring 数据 jdbc 和 java 11 和数据库的 postgres。 我知道这是一个人为的例子,但我不允许发布实际代码。

任何帮助将不胜感激! 谢谢!

@Data
@Table("parent")
public class ParentDTO {

    @Id
    private long parentId;
    private Date createdAt;
    @MappedCollection(idColumn="parent_id", keyColumn="parent_id")
    private Set<ChildDTO> children;
    String name;
}

@Data
@Table("child")
public class ChildDTO {

    @Id
    private long childId;
    private Date createdAt;
    private long parentId;
    String name;

    @MappedCollection(idColumn="lookup_id", keyColumn="lookup_id")
    private LookupDTO lookupDTO;
}

@Data
@Table("lookup")
public class LookupDTO {

    @Id
    private long lookupId;
    String name;
    private Date createdAt;
}

Cascade 不是 JPA/Spring-Data 中可以完全删除的可选功能。 实体关系将有一个默认的级联选项,因为它是底层数据库模式的反映。

在您的示例中,如果 ParentDTO 被删除,那么具有外键( ChildDTO.parentId )的 ChildDTO 如何存在于数据库中? Spring-Data JPA 正好反映了这种设计。

如果你想确保没有人删除 ParentDTO 或其他实体,那么你可以做几件事:

这里有一些想法:

  1. 对于您的 JDBC 用户 ID,将对这些表的数据库访问权限更改为只读。 如果他们是 static,那就应该是这样。
  2. 将存储库设为只读。 这是一个很好的讨论- 使用 SpringData 创建一个只读存储库
  3. 强制您的实体为只读。 这里的最佳答案是最好的 - 如何使实体只读? (实现一个 EntityListener,或者只是从您的实体中删除所有 setter 方法)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM