【问题标题】:How to prevent creating spring boot repository if table not exists?如果表不存在,如何防止创建 Spring Boot 存储库?
【发布时间】:2021-02-02 18:31:54
【问题描述】:

亲爱的,

我有一个连接两个不同数据源的应用程序。我根据启用/禁用属性处理了数据源连接。但是,我遇到了一种情况,即存在一个架构,但不包含正在使用我的应用程序的表。

我想知道我的应用程序启动时没有任何问题,即使表不存在(我还没有在任何地方初始化 Lazy)。我不明白为什么在启动应用程序时它没有失败?但是,当我尝试读取数据时失败了,除了 SCHEMA 中不存在 TABLE 之外。

我还需要知道如果表仅存在,我们是否有可能加载存储库/bean?我希望有人在不同地区部署时可能会遇到类似的问题。

【问题讨论】:

    标签: spring-boot spring-data-jpa spring-repositories


    【解决方案1】:

    在典型的生产设置中,JPA 实现(即可能是 Hibernate 或 EclipseLink)不会进行任何检查以查看模式是否符合他们的期望。 我认为这是一个非常合理的默认设置,因为在大多数设置中,当架构丢失或损坏时,应用程序实际上并没有任何合理的方式来采取行动。

    您可以激活验证,至少使用 Hibernate,我假设 EclipseLink 有类似的东西。 How to validate Hibernate mapping against database

    但这会引发异常并中止 EntityManager 的创建,因此停止启动您的应用程序,这似乎不是您想要的。

    控制存储库的注入似乎很难实现,但您可以做的是在存储库中有一个方法,查询数据字典中是否存在表并使用它来控制存储库是否被使用。

    【讨论】:

    • 感谢您的回答。目前,我在创建/加载每个数据源的 bean 时使用 ConditionalBean 处理。对于没有表的数据源,我将条件值作为 false 传递。当然,这不是动态解决方案,必须在启动应用程序时指定属性,我们应该知道给定数据源中是否存在表。这样,它甚至在启动应用程序本身时停止加载数据源的存储库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2016-06-19
    • 2018-12-04
    相关资源
    最近更新 更多