【问题标题】:JPA unmodifiable database rowJPA 不可修改的数据库行
【发布时间】:2021-11-07 00:23:51
【问题描述】:

问题

我目前正在开发 Spring-Application 作为大学项目的一部分,我们遇到了以下问题:

我有一个 JPA 实体,它为 States 的表建模,我想要一个硬编码的 End-State,它始终存在于数据库中并且无法删除或修改。在最好的情况下,它应该有一个特殊的 id(例如0),所以它可以很容易地从应用程序中引用。

我也不能将States 建模为枚举,因为它们必须在运行时可配置。

代码

实体看起来像这样(缩写):

@Entity
public class BillingItemState {

    @Autowired
    private BillingItemStateRepository billingItemStateRepository;

    @Id
    private String id;

    @NotEmpty
    private String name;

    @ManyToMany
    private List<BillingItemState> parentStates = new ArrayList<>();

    @ManyToMany(mappedBy = "parentStates", cascade = CascadeType.PERSIST)
    private List<BillingItemState> nextStates;
}

到目前为止我已经尝试过什么

我尝试通过使用@PrePersist@PreUpdate@PreDelete 来强制执行该规则,但这似乎不是一个很好的解决方案,因为这使我无法在创建数据库。我还想到了一些不太优雅的解决方案,比如为不可修改的 Final-State 拥有一个自己的 Table,但这也会引发一些问题。

是否有更合适的模式来完成这项任务?我觉得我在这里完全走错了路。

(另外,这是我的第一个问题。如果您对我的问题有任何改进,请发表评论:)

【问题讨论】:

    标签: java database hibernate spring-data-jpa


    【解决方案1】:

    我想你需要的是@Immutable

    此注释允许您使您的行不可变(您将无法进行任何更新)。

    但是插入动作和删除一样仍然是可能的。

    要摆脱删除的可能性,您可以尝试 @PreRemove 抛出一些异常或任何不同的逻辑。

    initialise database statedata.sql文件应该是好的。

    您也可以考虑FlywayLiquibase

    其他资源

    1. 关于@Immutable的文章
    2. Immutable user guide
    3. @PreRemove
    4. Spring docs about data.sql and database initialisation

    【讨论】:

      【解决方案2】:

      我想说,如果可以的话,尝试将Final 状态建模为某种属性,即boolean isEnd。这样您就可以轻松删除或设置静态数据。

      【讨论】:

        猜你喜欢
        • 2012-03-18
        • 2010-10-09
        • 2015-10-28
        • 2019-11-05
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 2014-10-25
        相关资源
        最近更新 更多